Pyside2 QSystemTrayIcon, левый клик / правый разные действия

Я хотел бы знать, как сделать в Python/Pyside2:

Создайте QSystemTrayIcon с пользовательским значком, в котором:

  • Если я нажимаю на него левую кнопку, я делаю свое собственное действие (в моем случае открываю внешний диалог, но достаточно просто напечатать "test"...). Меню не должно отображаться...

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

1 ответ

Для щелчка левой кнопкой мыши вы должны использовать активированный сигнал, используя причину триггера. В случае щелчка правой кнопкой мыши вам нужно только создать контекстное меню:

from PySide2 import QtCore, QtGui, QtWidgets

class Window(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.trayIcon = QtWidgets.QSystemTrayIcon(self)

        self.trayIconMenu = QtWidgets.QMenu(self)
        self.quitAction = QtWidgets.QAction("&Quit", self,
            triggered=QtWidgets.QApplication.instance().quit)
        self.trayIconMenu.addAction(self.quitAction)

        self.trayIcon.setContextMenu(self.trayIconMenu)
        self.trayIcon.show()

        # set icon
        icon = self.style().standardIcon(QtWidgets.QStyle.SP_MessageBoxInformation)
        # icon = QtGui.QIcon("/path/of/icon")
        self.trayIcon.setIcon(icon)

        self.trayIcon.activated.connect(self.iconActivated)

    @QtCore.Slot(QtWidgets.QSystemTrayIcon.ActivationReason)
    def iconActivated(self, reason):
        if reason in (QtWidgets.QSystemTrayIcon.Trigger, QtWidgets.QSystemTrayIcon.DoubleClick):
            self.resize(640, 480)
            self.show()

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication.instance()
    if app is None: 
        app = QtWidgets.QApplication(sys.argv)
    if not QtWidgets.QSystemTrayIcon.isSystemTrayAvailable():
        QtWidgets.QMessageBox.critical(None, "Systray",
            "I couldn't detect any system tray on this system.")
        sys.exit(1)
    QtWidgets.QApplication.setQuitOnLastWindowClosed(False)
    window = Window()
    sys.exit(app.exec_())
Другие вопросы по тегам