문제

PYQT4에서 트레이를 최소화하는 방법이 있습니까? 이미 QSystemTrayicon 클래스와 함께 일했지만 이제는 앱 창을 최소화하거나 "숨기고"트레이 아이콘 만 표시하고 싶습니다.

아무도 이것을 한 사람이 있습니까? 모든 방향은 감사 할 것입니다.

Window XP Pro에서 Python 2.5.4 및 PYQT4 사용

도움이 되었습니까?

해결책

실제로 최소화 할 방법이 없다는 것을 기억하면 꽤 간단합니다. 시스템 트레이.

대신, 당신은 이것을함으로써 그것을 가짜입니다.

  1. 창에서 최소화 이벤트를 잡으십시오
  2. 이벤트 핸들러 최소화에서 qsystemtrayicon을 만들고 표시하십시오.
  3. 또한 이벤트 핸들러 최소화에서 창에서 hide () 또는 setvisible (false)을 호출하십시오.
  4. 시스템 트레이 아이콘에서 클릭/두 번 클릭/메뉴 항목을 찾으십시오.
  5. 시스템 트레이 아이콘 이벤트 핸들러에서 창에서 show () 또는 setvisible (true)을 호출하고 선택적으로 트레이 아이콘을 숨기십시오.

다른 팁

코드는 도움이되므로 여기에 최소화 이벤트 대신 CloseEvent를 제외하고는 응용 프로그램에 쓴 내용이 있습니다.

메모:

"CloseEvent (이벤트)"는 재정의 QT 이벤트이므로 숨길 창을 구현하는 클래스에 넣어야합니다.

"Okantoclose ()"은 때때로 Systray를 최소화하는 대신 응용 프로그램을 종료하려고하기 때문에 구현을 고려할 수있는 기능 (또는 저장하려는 부울 플래그)입니다.

창문을 다시 표시하는 방법의 예도 있습니다.

def __init__(self):
  traySignal = "activated(QSystemTrayIcon::ActivationReason)"
  QtCore.QObject.connect(self.trayIcon, QtCore.SIGNAL(traySignal), self.__icon_activated)

def closeEvent(self, event):
  if self.okayToClose(): 
    #user asked for exit
    self.trayIcon.hide()
    event.accept()
  else:
    #"minimize"
    self.hide()
    self.trayIcon.show() #thanks @mojo
    event.ignore()

def __icon_activated(self, reason):
  if reason == QtGui.QSystemTrayIcon.DoubleClick:
    self.show()

Chris의 예제에 추가하기 위해 :

중요합니다 신호를 선언 할 때 QT 표기법을 사용한다는 것, 즉

옳은:

self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.iconClicked)

그리고 pyqt 하나가 아닙니다

잘못된 그리고 작동하지 않을 것입니다 :

self.connect(self.icon, SIGNAL("activated(QSystemTrayIcon.ActivationReason)"), self.iconClicked)

참고 :: 신호 문자열에서. 이것은 알아내는 데 약 3 시간이 걸렸습니다.

여기에 작업 코드가 있습니다. 감사합니다 매트 ~을 위한 중대한, 신호는 더 많은 호기심이 필요했지만 .. 그러나 다른 일을하고 있습니다. 그래서 #을 위해 ta! 순간 :-)

def create_sys_tray(self):
    self.sysTray = QtGui.QSystemTrayIcon(self)
    self.sysTray.setIcon( QtGui.QIcon('../images/corp/blip_32.png') )
    self.sysTray.setVisible(True)
    self.connect(self.sysTray, QtCore.SIGNAL("activated(QSystemTrayIcon::ActivationReason)"), self.on_sys_tray_activated)

    self.sysTrayMenu = QtGui.QMenu(self)
    act = self.sysTrayMenu.addAction("FOO")

def on_sys_tray_activated(self, reason):
    print "reason-=" , reason

이것은 Vzades 응답의 편집 이었지만 여러 근거로 거부되었습니다. 코드와 똑같은 일을하지만 최소화 이벤트를 준수합니다 (구문 오류/누락 아이콘없이 실행).

import sys
from PyQt4 import QtGui, QtCore


class Example(QtGui.QWidget):
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        style = self.style()

        # Set the window and tray icon to something
        icon = style.standardIcon(QtGui.QStyle.SP_MediaSeekForward)
        self.tray_icon = QtGui.QSystemTrayIcon()
        self.tray_icon.setIcon(QtGui.QIcon(icon))
        self.setWindowIcon(QtGui.QIcon(icon))

        # Restore the window when the tray icon is double clicked.
        self.tray_icon.activated.connect(self.restore_window)

    def event(self, event):
        if (event.type() == QtCore.QEvent.WindowStateChange and 
                self.isMinimized()):
            # The window is already minimized at this point.  AFAIK,
            # there is no hook stop a minimize event. Instead,
            # removing the Qt.Tool flag should remove the window
            # from the taskbar.
            self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.Tool)
            self.tray_icon.show()
            return True
        else:
            return super(Example, self).event(event)

    def closeEvent(self, event):
        reply = QtGui.QMessageBox.question(
            self,
            'Message',"Are you sure to quit?",
            QtGui.QMessageBox.Yes | QtGui.QMessageBox.No,
            QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            self.tray_icon.show()
            self.hide()
            event.ignore()

    def restore_window(self, reason):
        if reason == QtGui.QSystemTrayIcon.DoubleClick:
            self.tray_icon.hide()
            # self.showNormal will restore the window even if it was
            # minimized.
            self.showNormal()

def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

이것은 PYQT5의 트레이 아이콘을 두 번 클릭하는 올바른 방법입니다.

def _create_tray(self):
    self.tray_icon = QSystemTrayIcon(self)
    self.tray_icon.activated.connect(self.__icon_activated)

def __icon_activated(self, reason):
    if reason in (QSystemTrayIcon.Trigger, QSystemTrayIcon.DoubleClick):
        pass

이것은 코드이며 코드를 보여주는 데 도움이됩니다.

import sys
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QDialog, QApplication, QPushButton, QLineEdit, QFormLayout, QSystemTrayIcon


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        self.icon = QSystemTrayIcon()
        r = self.icon.isSystemTrayAvailable()
        print r
        self.icon.setIcon(QtGui.QIcon('/home/vzades/Desktop/web.png'))
        self.icon.show()
        # self.icon.setVisible(True)
        self.setGeometry(300, 300, 250, 150)
        self.setWindowIcon(QtGui.QIcon('/home/vzades/Desktop/web.png'))
        self.setWindowTitle('Message box')
        self.show()
        self.icon.activated.connect(self.activate)
        self.show()

    def closeEvent(self, event):

        reply = QtGui.QMessageBox.question(self, 'Message', "Are you sure to quit?", QtGui.QMessageBox.Yes |
                                           QtGui.QMessageBox.No, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:
            event.accept()
        else:
            self.icon.show()

            self.hide()

            event.ignore()

    def activate(self, reason):
        print reason
        if reason == 2:
            self.show()

    def __icon_activated(self, reason):
        if reason == QtGui.QSystemTrayIcon.DoubleClick:
            self.show()


def main():

    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top