gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:50:04 25 4
gpt4 key购买 nike

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

从系统托盘图标菜单中,单击 QDialog,对话框打开,等待用户操作,然后单击 Ok 或 Cancel 按钮将打印单击了哪一个。看起来这很有效,因为 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_()

最佳答案

我已经让它工作了。我所做的是移动您的外部方法qmainwindow在你的里面SysTrayIcon并创建了类参数 self.qmainwindow_class_obj = TestClassQMainWindow() .我在下面附上了工作代码。另外,您使用的是旧式信号槽方法,我认为您来自老式 PyQt。新方法非常好,干净和pythonic。我还将新样式方法放在下面的代码中。我要做的另一件事是移动您的qdialog SysTrayIcon 中的方法类(class)。我真的不明白你为什么在课外有它,但也许我错过了一些东西。希望这可以帮助。

#!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_()

关于pyqt - 当从另一个 QMainWindow 调用时,QMainWindow 闪烁并消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10183213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com