23

PyQt4でトレイを最小化する方法はありますか? 既に QSystemTrayIcon クラスを使用していますが、アプリ ウィンドウを最小化または「非表示」にして、トレイ アイコンのみを表示したいと考えています。

誰もこれをやったことがありますか?任意の方向をいただければ幸いです。

Window XP Pro で Python 2.5.4 と PyQt4 を使用する

4

7 に答える 7

35

システム トレイに実際に最小化する方法がないことを覚えていれば、非常に簡単です。

代わりに、次のようにして偽装します。

  1. ウィンドウで最小化イベントをキャッチします
  2. 最小化イベント ハンドラーで、QSystemTrayIcon を作成して表示します。
  3. また、最小化イベント ハンドラーで、ウィンドウで hide() または setVisible(false) を呼び出します。
  4. システム トレイ アイコンのクリック/ダブルクリック/メニュー項目をキャッチ
  5. システム トレイ アイコン イベント ハンドラーで、ウィンドウで show() または setVisible(true) を呼び出し、オプションでトレイ アイコンを非表示にします。
于 2009-04-16T22:53:20.933 に答える
12

コードが役立つので、最小化イベントの代わりに closeEvent を除いて、アプリケーション用に書いたものを次に示します。

ノート:

「closeEvent(event)」はオーバーライドされた Qt イベントであるため、非表示にするウィンドウを実装するクラスに配置する必要があります。

「okayToClose()」は、systray に最小化する代わりに実際にアプリケーションを終了したい場合があるため、実装を検討できる関数 (または保存したいブール値のフラグ) です。

ウィンドウを再度 show() する方法の例もあります。

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()
于 2009-04-16T23:17:59.237 に答える
7

クリスの例に追加するだけです:

シグナルを宣言するときは Qt 表記を使用することが重要です。

正しい:

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

PyQtのものではありません

正しくなく、動作しません:

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

::シグナル文字列の に注意してください。これを理解するのに約3時間かかりました。

于 2009-11-15T14:49:31.017 に答える
4

ここに作業コードがあります.CrucialMatzeに感謝します.SIGNALは私にさらに多くの時間を費やしました..しかし、他のことをしています。#だから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
于 2011-01-13T05:01:05.567 に答える
1

これはコードであり、コードを表示するのに役立ちます

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()
于 2011-11-06T13:11:45.183 に答える