Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt4最小化到托盘_Python_Pyqt4_System Tray_Minimize - Fatal编程技术网

Python PyQt4最小化到托盘

Python PyQt4最小化到托盘,python,pyqt4,system-tray,minimize,Python,Pyqt4,System Tray,Minimize,有没有办法将PyQt4中的托盘最小化?我已经使用过QSystemTrayIcon类,但现在我想最小化或“隐藏”我的应用程序窗口,只显示托盘图标 有人这样做过吗?任何指示都将不胜感激 在windowxppro上使用python2.5.4和PyQt4非常简单,只要您记住,实际上没有办法最小化到最小 相反,你可以通过这样做来伪装它: 捕获窗口上的最小化事件 在最小化事件处理程序中,创建并显示QSystemTrayIcon 同样在最小化事件处理程序中,在窗口上调用hide()或setVisible(fa

有没有办法将PyQt4中的托盘最小化?我已经使用过QSystemTrayIcon类,但现在我想最小化或“隐藏”我的应用程序窗口,只显示托盘图标

有人这样做过吗?任何指示都将不胜感激


在windowxppro上使用python2.5.4和PyQt4非常简单,只要您记住,实际上没有办法最小化到最小

相反,你可以通过这样做来伪装它:

  • 捕获窗口上的最小化事件
  • 在最小化事件处理程序中,创建并显示QSystemTrayIcon
  • 同样在最小化事件处理程序中,在窗口上调用hide()或setVisible(false)
  • 捕捉系统托盘图标上的单击/双击/菜单项
  • 在系统托盘图标事件处理程序中,在窗口上调用show()或setVisible(true),并可以选择隐藏托盘图标

  • 代码很有帮助,所以这里有一些我为应用程序编写的东西,除了closeEvent而不是minimize事件

    注:

    “closeEvent(event)”是一个重写的Qt事件,因此必须将其放入实现要隐藏的窗口的类中

    “OkaytoCutele[()”是一个你可以考虑实现的函数(或者你想存储的布尔标志),因为有时你真的想退出应用程序而不是最小化到SyStay./P> 还有一个示例说明如何再次显示()窗口

    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)
    

    注意信号字符串中的
    。这花了我大约三个小时才弄明白。

    这是工作代码。Matze感谢至关重要的,这个信号让我好奇了好几个小时。。但是做其他事情。所以,我要一个#!时刻:-)


    这就是代码,它确实有助于我相信向我展示代码

    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()
    

    这是对vzades回复的编辑,但由于一些原因被拒绝。它的功能与它们的代码完全相同,但也将遵循最小化事件(并且在没有语法错误/缺少图标的情况下运行)


    这是处理双击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
    

    #“minimize”self.hide()self.trayIcon.show()event.ignore()我添加了@mojo关于如何灵活处理系统托盘图标的建议。最初的代码来自一个应用程序,其中托盘图标始终可见,self.trayIcon.hide()是这样的,这样退出后图标就不会粘在系统托盘上(很遗憾,这是典型的windows行为)。请注意,现在用户必须实现showEvent(event)方法并调用self.trayIcon.hide()来完成此示例。我应该首先发布一个仅最小化/恢复的示例:)请使用>>“使用Qt符号至关重要”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(“已激活”(QSystemTrayIcon::ActivationReason)”),self.on_系统托盘_激活)self.sysTrayMenu=QtGui.QMenu(self)act=self.sysTrayMenu.addAction(“FOO”)def on_系统托盘_激活(self,reason):打印“原因-=”,原因此代码看起来很糟糕。它是如何获得选票的,这是无法理解的。我不明白为什么它如此糟糕。可能比问题要求的要多一些,并且解释得简短一些,但在其他方面与常规代码类似。如何使它在启动后仅显示托盘图标?如果我将setWindowFlags行移动到initUI(),它没有任何效果,正常窗口仍然显示upI了解这并不能直接回答问题,但这个问题有很多观点,谷歌的人正在寻找一个更及时的答案。
    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()
    
    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