2012-04-16 16 views
2

これはかなり単純なコードで、3つの右クリックオプションを持つシステムトレイ項目が作成されます。 1つはQDialog、もう1つのQMainWindow、Quitのインスタンスです。これは、いくつかのqdialogsを持つシステムトレイ駆動のアプリケーションのためのもので、qmainwindowはテーブルウィジェットを含んでいます(または、qdialogにテーブルを作成することはできますか?)。私はこれに1週間ほどかかりましたが、多くの関連資料を読み、それを解決する方法を理解していません。QMainWindowが別のQMainWindowから呼び出されたときに点滅して消えます

システムトレイのアイコンメニューからQDialogをクリックすると、ダイアログボックスが開き、ユーザーの操作を待ってからOKまたはCancelボタンをクリックすると、クリックされたものが印刷されます。これは、QDialogが独自のexec_()を持っているので、このように思えます。今のところ素晴らしい。

しかし、[QMainWindow]メニューオプションをクリックすると、メインウィンドウのダイアログが短時間表示され、ユーザーの入力がなくなると消えます。たぶん代わりに、qmainwindowダイアログは、おそらくapp.exec_()の直前でオブジェクトを初期化するQApplicationの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_() 

答えて

3

私はそれが働いている。私がしたのは、あなたの外部メソッドqmainwindowSysTrayIconの中に移動し、クラスパラメータself.qmainwindow_class_obj = TestClassQMainWindow()を作成したことです。私は以下の作業コードを添付しました。また、古いスタイルのシグナルスロットメソッドを使用している、私はあなたが古い学校PyQtから来ているそれを取る。新しいメソッドは非常にいい、清潔でpythonic場合。私はまた、新しいスタイルメソッドを以下のコードに入れました。私がするもう一つの方法は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_() 
+0

ありがとう。私のプログラムに取り入れ、約3k行のコードに取り組んでいます。また、connect()の追加に感謝します。 – gseattle

関連する問題