Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Получить доступ из одного окна к другому [RSS Feed]

#1 Июнь 4, 2017 17:45:04

Edith
Зарегистрирован: 2017-06-01
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Получить доступ из одного окна к другому

Доброго времени суток!
Такая проблема возникла:
Есть класс трей иконки

 from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
class SystemTrayIcon(QSystemTrayIcon):
    def __init__(self, parent=None):
        QSystemTrayIcon.__init__(self, parent)
        # создаем трей иконку
        self.setObjectName('trayIcon')
        self.setIcon(QIcon(".data/img/Application-icon-wob.png"))
        self.activated.connect(self.onTrayIconActivated)
        self.installEventFilter(self)
        self.show()
    def onTrayIconActivated(self, event):
        if event == QSystemTrayIcon.DoubleClick:
            pass
        elif event == QSystemTrayIcon.Context:
            qApp.quit()
Класс формы(окна)
 from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtMultimedia import *
from PyQt5.QtGui import *
from functions.main_funcs import (getScreen)
import configparser
import webbrowser
class ProfileForm(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool)  # окно без рамок и заголовка, не отображается на панели задач
        self.setAttribute(Qt.WA_TranslucentBackground)  # прозрачный бек окна
        self.setFixedSize(330, 220)
        self.setObjectName('ProfileForm')
        QFontDatabase.addApplicationFont(".data/fonts/Micra_Normal.ttf")
        self.config = configparser.ConfigParser()
        self.config.read('config.ini')
        # тут много дальше всего не суть важно...
        # показываем окно
        self.show()
    def close(self):
        self.hide()

И собственно файл запуска программы
 from os import *
from forms.profile_form import ProfileForm
from forms.systray import SystemTrayIcon
from functions.main_funcs import *
import sys
if __name__ == '__main__':
    pid = getpid()  # запись процесса
    # проверяем наличие конфига и создаем если его нет
    if path.exists('config.ini') == False:
        createConfig()
    # Создаем приложение
    app = QApplication(sys.argv)
    # Загружаем форму профиля
    ProfileForm = ProfileForm()
    # Загружаем трей иконку
    tray = SystemTrayIcon()
    # Выполняем запуск приложения
    sys.exit(app.exec_())

Как в трей иконке при дабл клике
     def onTrayIconActivated(self, event):
        if event == QSystemTrayIcon.DoubleClick:
            pass
сделать так, чтобы окно ProfileForm закрылось т.е. сработала функция ProfileForm.close()
Пробовала и через глобалс
типа:
         if event == QSystemTrayIcon.DoubleClick:
            global ProfileForm
            ProfileForm.close()

и через наследование
 from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from forms.profile_form import ProfileForm
class SystemTrayIcon(QSystemTrayIcon,ProfileForm):
    def __init__(self, parent=None):
        QSystemTrayIcon.__init__(self, parent)
        # создаем трей иконку
        self.setObjectName('trayIcon')
        self.setIcon(QIcon(".data/img/Application-icon-wob.png"))
        self.activated.connect(self.onTrayIconActivated)
        self.installEventFilter(self)
        self.show()
    def onTrayIconActivated(self, event):
        if event == QSystemTrayIcon.DoubleClick:
            ProfileForm.close()
        elif event == QSystemTrayIcon.Context:
            qApp.quit()

выдает вобоих случаях


Вообще не врублюсь как получить доступ к форме))

Офлайн

#2 Июнь 4, 2017 20:06:16

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Получить доступ из одного окна к другому

пример для PyQt4 , для пятого должно легко переделываться
нужно закрыть предварительно все окна.

 import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
import win32gui #не обязательно нужно чтобы выдрать иконку с shell32.dll
class SystemTrayIcon(QtGui.QSystemTrayIcon):
    def __init__(self, mainWindow, parent=None):
        super().__init__(parent)
        # создаем трей иконку
        self.setObjectName('trayIcon')
        # получаем иконку в виде звездочки из shell32.dll
        fname = 'c:\\windows\\system32\\shell32.dll'
        hicon = win32gui.ExtractIcon(0, fname, 43)
        pixmap = QtGui.QPixmap.fromWinHICON(hicon)
        win32gui.DestroyIcon(hicon)
        self.setIcon(QtGui.QIcon(pixmap))
        self.mainWindow = mainWindow
        self.activated.connect(self.onTrayIconActivated)
        self.show()
    def onTrayIconActivated(self, reason):
        if reason == QtGui.QSystemTrayIcon.DoubleClick:
            # Дабл-клик показать/скрыть главное окно
            self.mainWindow.toggle()
        elif reason == QtGui.QSystemTrayIcon.Context:
            # ПКМ - все закрыть и выйти
            self.hide()
            self.mainWindow.close()          # закрываем главное окно
            QtGui.qApp.closeAllWindows() # на всякий случай :) закрыть все окна
            QtGui.qApp.quit()                   # выход
class MainWindow(QtGui.QWidget):
    # Главное окно программы, ничего не делает. прочто для примера
    def __init__(self, parent=None):
        super().__init__(parent)
        self.show()
    def toggle(self):
        if self.isHidden():
            self.show()
            self.activateWindow()
        else:
            self.hide()
if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    app.setQuitOnLastWindowClosed(False) # не завершать QApplication при закрытиии последнего окна
    mainWindow = MainWindow()
    trayIcon = SystemTrayIcon(mainWindow)
    sys.exit(app.exec_())



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Июнь 4, 2017 20:11:48)

Офлайн

  • Начало
  • » GUI
  • » Получить доступ из одного окна к другому[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version