2

このかなり最小限のコードは、3 つの右クリック オプションを備えたシステム トレイ項目を作成します。1 つは QDialog のインスタンス、もう 1 つは QMainWindow、そして Quit です。これは、いくつかの qdialog と、テーブル ウィジェットを含む qmainwindow を持つシステム トレイ駆動型アプリ用です (または、qdialog にテーブルを作成することは可能ですか?)。私はこれに 1 週​​間ほど行き詰まっており、多くの関連資料を読み、解決方法がわかりません。

systray アイコン メニューから QDialog をクリックすると、ダイアログが開き、ユーザーの操作を待ち、[OK] または [キャンセル] ボタンをクリックすると、どちらがクリックされたかが出力されます。QDialog には独自の exec_() があるため、これは機能しているように見えます。これまでのところ素晴らしい。

ただし、QMainWindow メニュー オプションをクリックすると、メイン ウィンドウのダイアログが短時間表示され、もちろん、ユーザーが入力する機会もなく消えます。代わりに、qmainwindow ダイアログは QApplication の exec_() に依存する必要があり、代わりに app.exec_() の直前にオブジェクトが初期化されるのでしょうか? それが機能する場合、 def qmainwindow() がユーザーから情報を取得する方法については明確ではありません。

いくつかの変更、ビンゴを知っている人にとっては簡単なことです。

現在の環境: Windows 7 または XP、Python 2.7、Pyside

これを実行すると、クリック (右クリック) できるシステム トレイに空白のプレースホルダーが表示されます。または、'sample.png' の代わりに実際の画像を指定することもできます。

#!python

from PySide       import QtGui, QtCore
from PySide.QtGui import QApplication, QDialog, QMainWindow

def qdialog():
    qdialog_class_obj = TestClassQDialog()
    qdialog_class_obj.show()
    qdialog_class_obj.exec_()    # wait for user

    print "qdialog_user_action: ", qdialog_class_obj.qdialog_user_action

def qmainwindow():
    qmainwindow_class_obj = TestClassQMainWindow()
    qmainwindow_class_obj.show()
    #qmainwindow_class_obj.exec_()  # 'TestClassQMainWindow' object has no attribute 'exec_'

class TestClassQDialog(QDialog):
    def __init__(self, parent=None):    
        super(TestClassQDialog, self).__init__(parent)
        self.ok_cancel = QtGui.QDialogButtonBox(self)
        self.ok_cancel.setStandardButtons(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel)
        QtCore.QObject.connect(self.ok_cancel, QtCore.SIGNAL("accepted()"), self.button_ok)
        QtCore.QObject.connect(self.ok_cancel, QtCore.SIGNAL("rejected()"), self.button_cancel)

    def button_ok(self):
        self.qdialog_user_action = 'ok'
        self.hide()

    def button_cancel(self):
        self.qdialog_user_action = 'cancel'
        self.hide()

class TestClassQMainWindow(QMainWindow):
    def __init__(self, parent=None):    
        super(TestClassQMainWindow, self).__init__(parent)
        self.ok_cancel = QtGui.QDialogButtonBox(self)
        self.ok_cancel.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        QtCore.QObject.connect(self.ok_cancel, QtCore.SIGNAL("accepted()"), self.button_ok)
        QtCore.QObject.connect(self.ok_cancel, QtCore.SIGNAL("rejected()"), self.button_cancel)

    def button_ok(self):
        self.hide()

    def button_cancel(self):
        self.hide()

class SysTrayIcon(QMainWindow):
    def __init__(self, parent=None):
        super(SysTrayIcon, self).__init__(parent)

        self.qdialog_action     = QtGui.QAction("QDialog",     self, triggered=qdialog)
        self.qmainwindow_action = QtGui.QAction("QMainWindow", self, triggered=qmainwindow)
        self.quit_action        = QtGui.QAction("Quit",        self, triggered=QtGui.qApp.quit)

        self.createSystrayIcon()
        self.systrayIcon.show()

    def createSystrayIcon(self):
        self.systrayIconMenu = QtGui.QMenu(self)
        self.systrayIconMenu.addAction(self.qdialog_action)
        self.systrayIconMenu.addAction(self.qmainwindow_action)
        self.systrayIconMenu.addSeparator()
        self.systrayIconMenu.addAction(self.quit_action)
        self.systrayIcon = QtGui.QSystemTrayIcon(self)
        self.systrayIcon.setContextMenu(self.systrayIconMenu)
        self.systrayIcon.setIcon(QtGui.QIcon('sample.png')) # point to a valid image if you want.
        self.systrayIcon.setVisible(True)

if __name__ == '__main__':
    app = QtGui.QApplication([])
    systrayicon = SysTrayIcon()
    app.exec_()
4

1 に答える 1

3

私はそれが働いている。私がしたことは、外部メソッドqmainwindowを内部 に移動SysTrayIconし、クラス パラメータを作成することself.qmainwindow_class_obj = TestClassQMainWindow()でした。以下に作業コードを添付しました。また、古いスタイルのシグナル スロット メソッドを使用しています。古い学校の PyQt から来ていると思います。新しいメソッドは、非常に素晴らしく、クリーンで、pythonic です。また、新しいスタイル メソッドを以下のコードに入れました。私がするもう1つのことは、メソッドをクラスqdialog内に移動することです。SysTrayIconクラスの外にある理由がよくわかりませんが、何かが足りないのかもしれません。お役に立てれば。

#!python

from PySide       import QtGui, QtCore
from PySide.QtGui import QApplication, QDialog, QMainWindow

def qdialog():
    qdialog_class_obj = TestClassQDialog()
    qdialog_class_obj.show()
    qdialog_class_obj.exec_()    # wait for user
    print "qdialog_user_action: ", qdialog_class_obj.qdialog_user_action


class TestClassQDialog(QDialog):
    def __init__(self, parent=None):    
        super(TestClassQDialog, self).__init__(parent)
        self.ok_cancel = QtGui.QDialogButtonBox(self)
        self.ok_cancel.setStandardButtons(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel)        
        self.ok_cancel.accepted.connect(self.button_ok)
        self.ok_cancel.rejected.connect(self.button_cancel)

    def button_ok(self):
        self.qdialog_user_action = 'ok'
        self.hide()

    def button_cancel(self):
        self.qdialog_user_action = 'cancel'
        self.hide()

class TestClassQMainWindow(QMainWindow):
    def __init__(self, parent=None):    
        super(TestClassQMainWindow, self).__init__(parent)
        self.ok_cancel = QtGui.QDialogButtonBox(self)
        self.ok_cancel.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        self.ok_cancel.accepted.connect(self.button_ok)
        self.ok_cancel.rejected.connect(self.button_cancel)

    def button_ok(self):
        self.hide()

    def button_cancel(self):
        self.hide()

class SysTrayIcon(QMainWindow):
    def __init__(self, parent=None):
        super(SysTrayIcon, self).__init__(parent)

        self.qmainwindow_class_obj = TestClassQMainWindow()

        self.qdialog_action     = QtGui.QAction("QDialog",     self, triggered=qdialog)
        self.qmainwindow_action = QtGui.QAction("QMainWindow", self, triggered=self.qmainwindow)
        self.quit_action        = QtGui.QAction("Quit",        self, triggered=QtGui.qApp.quit)

        self.createSystrayIcon()
        self.systrayIcon.show()

    def createSystrayIcon(self):
        self.systrayIconMenu = QtGui.QMenu(self)
        self.systrayIconMenu.addAction(self.qdialog_action)
        self.systrayIconMenu.addAction(self.qmainwindow_action)
        self.systrayIconMenu.addSeparator()
        self.systrayIconMenu.addAction(self.quit_action)
        self.systrayIcon = QtGui.QSystemTrayIcon(self)
        self.systrayIcon.setContextMenu(self.systrayIconMenu)
        self.systrayIcon.setIcon(QtGui.QIcon('linux.jpeg')) # point to a valid image if you want.
        self.systrayIcon.setVisible(True)

    def qmainwindow(self):
        self.qmainwindow_class_obj.show()


if __name__ == '__main__':
    app = QtGui.QApplication([])
    systrayicon = SysTrayIcon()
    app.exec_()
于 2012-04-17T01:56:10.743 に答える