当从另一个QMainWindow调用时,QMainWindow会闪烁并消失

时间:2012-04-16 23:44:32

标签: pyqt pyside qmainwindow

这个相当小的代码创建了一个带有三个右键单击选项的系统托盘项目。一个是QDialog的实例,另一个是QMainWindow,也是Quit。这是一个系统托盘驱动的应用程序,它将有一些qdialogs,还有一个包含表格小部件的qmainwindow(或者,是否可以在qdialog中创建一个表?)。我已经坚持了一个星期左右,阅读了很多相关材料,并且不明白如何解决它。

在系统托盘图标菜单中,单击QDialog,对话框打开,等待用户操作,单击“确定”或“取消”按钮将打印单击了哪一个。这似乎是有效的,因为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_()

1 个答案:

答案 0 :(得分:3)

我已经开始工作了。我所做的是将你的外部方法qmainwindow移到你的内部 SysTrayIcon并创建了类参数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_()