PyQt4 Tray Icon Проблема при отображении QLabel - PullRequest
0 голосов
/ 15 марта 2011

Когда запускается следующий код, приложение в трее может всплывать объект AboutWindow QLabel в середине экрана. Но при закрытии этого экрана все приложение выключается без ошибок (значок в трее исчезает, а в журнале консоли вообще не отображается никаких ошибок).

import sys
from PyQt4 import QtGui, QtCore


class AboutWindow(QtGui.QLabel):

def __init__(self, parent=None):
    QtGui.QLabel.__init__(self, parent=parent)
    self.setText("""
    Huge text goes here
    """)


class SystemTrayIcon(QtGui.QSystemTrayIcon):
    def __init__(self, icon, parent=None):
        QtGui.QSystemTrayIcon.__init__(self, icon, parent)
        menu = QtGui.QMenu(parent)
        self.createMenuActions(menu)
        self.setContextMenu(menu)
        # I've tried using the same parent as QSystemTrayIcon, 
        # but the label is not shown.
        # self.aboutWindow = AboutWindow(parent=parent)
        self.aboutWindow = AboutWindow(parent=None)


    def createMenuActions(self, menu):
        exitAction = QtGui.QAction("Exit", menu)
        configureAppAction = QtGui.QAction("Configure Application", menu)
        aboutAction = QtGui.QAction("About", menu)

        self.connect(configureAppAction, QtCore.SIGNAL('triggered()'), self._configureApp)
        self.connect(aboutAction, QtCore.SIGNAL('triggered()'), self._showAbout)
        self.connect(exitAction, QtCore.SIGNAL('triggered()'), self._exitApp)

        self.addActionsToMenu(menu, configureAppAction, aboutAction, exitAction)

    def addActionsToMenu(self, menu, *args):
        for action in args:
            menu.addAction(action)

    def _configureApp(self): pass

    def _showAbout(self):
        self.aboutWindow.show()

    def _exitApp(self):
        sys.exit(0)

def main():
    app = QtGui.QApplication(sys.argv)
    widget = QtGui.QWidget()
    # I'm passing a widget parent to QSystemTrayIcon as pointed out in:
    # /782975/pyqt-pokazat-meny-v-prilozhenii-na-paneli-zadach
    trayIcon = SystemTrayIcon(QtGui.QIcon("icon.xpm"), widget)
    trayIcon.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

Как указано в коде, я попытался установить один и тот же родительский элемент для иконки в трее и объекта AboutWindow, но это не сработало (метка не отображается). Я также пытался создать подкласс QMainWindow, но тот же эффект произошел.

Я хотел бы понять, является ли это поведением по умолчанию при открытии нового окна из QSystemTrayIcon, когда ни у окна, ни у значка нет общего родительского элемента, и если для этого есть обходной путь.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 июня 2013

Эта проблема возникает из-за того, что когда вы закрываете окно «only», Qt ошибочно думает, что вы хотите выйти из приложения.Ваш ответ (Kaos12) - это некрасивое решение imho, иногда вы действительно хотите закрыть материал (это не то же самое, что скрыть его).Правильный способ сделать это - отключить это поведение, добавив строку:

app.setQuitOnLastWindowClosed(False)

после строки 50 в этом коде (после «создания» приложения).Эта инструкция скажет Qt не выходить из приложения, даже когда все окна закрыты.

0 голосов
/ 17 марта 2011

Хорошо, я думаю, я не слишком ясно понял проблему, но нашел простое решение.

У Qt есть метод, который захватывает событие close, отправленное виджету (http://doc.qt.nokia.com/4.6/qwidget.html#closeEvent). Вы можете,в своем подклассе QWidget перепишите этот метод, чтобы предотвратить закрытие виджета (который во всех моих тестах закрывал бы все приложение) и только скрыть его. Приведенный ниже код показывает, что я изменил в своем коде, чтобы он работал:

...

class AboutWindow(QtGui.QLabel):

    def __init__(self, parent=None):
        QtGui.QLabel.__init__(self, parent=parent)
        self.setText("""
        Huge text goes here
        """)

    # Prevent the widget from closing the whole application, only hides it
    def closeEvent(self, event):
        event.ignore()
        self.hide()

...
...