因此,我不确定标题是否是最好的描述,但这是我想出的。这是交易。我正在开发一种PyQt应用程序,该应用程序具有某种插件系统,您可以在其中将一些子类添加到文件夹中,然后该应用程序会找到它们。这些命令可以选择自己创建一些用户界面。基本上,它们看起来像这样:
class Command(object):
def do(self):
self.setupUi()
self.pre()
self.run()
self.post()
def pre(self):
# do setup stuff for run method
def run(self):
# do actual work
def post(self):
# clean up after run
def setupUi(self):
# create a ui for this command
diag = QDialog()
diag.exec_()
现在,我遇到的问题是,我有一个命令可以创建一个对话框,并等待用户接受它。然后,我需要在命令运行时将对话框切换为非模式对话框,并更新对话框。这一切似乎都很好。但是,问题在于,直到pre,run和post方法完成后,我才能重绘对话框。所以,如果我有这样的setupUi:
def setupUi(self):
# create a ui for this command
diag = QDialog()
if diag.exec_():
diag.setModal(False)
diag.show()
我尝试了processEvents,但似乎没有做到。是否还有其他人遇到此问题,或者是否有任何解决方法?
谢谢
使用diag.exec_()
将阻塞,直到对话框返回(关闭)。因此,如果您需要自己调用show()
。从这里开始有几种方法。
pre
,run
以及post
命令对话框假设您希望将代码的内容排除在对话框类之外,并且由于最好避免定期轮询,因此以下是第一种策略的示例:
import sys, time
from PyQt4 import QtCore, QtGui
class MyDialog(QtGui.QDialog):
def __init__(self,parent=None):
QtGui.QDialog.__init__(self,parent)
layout = QtGui.QVBoxLayout()
self.msg = QtGui.QLabel('some sort of status')
self.buttonbox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok, QtCore.Qt.Horizontal, self)
self.buttonbox.accepted.connect(self.accept)
layout.addWidget(self.msg)
layout.addWidget(self.buttonbox)
self.setLayout(layout)
def set_msg(self, new_msg):
self.msg.setText(new_msg)
def set_function_on_accept(self,fcn):
self.function = fcn
def accept(self):
self.function()
class Command(object):
def do(self):
self.setupUi()
def do_work(self):
self.pre()
self.run()
self.post()
def pre(self):
# do setup stuff for run method
time.sleep(1)
self.diag.set_msg("stuff setup")
QtGui.QApplication.processEvents()
def run(self):
# do actual work
time.sleep(1)
self.diag.set_msg("work done")
QtGui.QApplication.processEvents()
def post(self):
# clean up after run
time.sleep(1)
self.diag.set_msg("cleaned up")
QtGui.QApplication.processEvents()
def setupUi(self):
# create a ui for this command
diag = MyDialog()
self.diag = diag
diag.set_function_on_accept(self.do_work)
diag.show()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
command = Command()
command.do()
sys.exit(app.exec_())
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句