接受不重画后QDialog切换到非模式

用户名

因此,我不确定标题是否是最好的描述,但这是我想出的。这是交易。我正在开发一种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,但似乎没有做到。是否还有其他人遇到此问题,或者是否有任何解决方法?

谢谢

hackyday

使用diag.exec_()将阻塞,直到对话框返回(关闭)。因此,如果您需要自己调用show()从这里开始有几种方法。

  1. 您可以让对话框接受插槽运行对其余命令的引用
  2. 您可以轮询对话框以查看用户是否已接受
  3. 您可以移动prerun以及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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

切换到cmd模式后再切换回PowerShell模式

来自分类Dev

从用户模式切换到内核模式

来自分类Dev

从用户模式切换到内核模式

来自分类Dev

引导加载程序后如何从实模式切换到保护模式?

来自分类Dev

切换到cli模式后,如何粘贴从gui模式中选择的文本?

来自分类Dev

React不会切换到生产模式

来自分类Dev

Notepad ++切换到奇怪的编辑模式

来自分类Dev

在Firemonkey中切换到发布模式

来自分类Dev

Chrome突然切换到“夜间模式”

来自分类Dev

如何切换到桌面模式

来自分类Dev

SELinux不会切换到“强制”模式

来自分类Dev

切换到操作系统后,如何强制GRUB保持视频模式?

来自分类Dev

在Kali Linux中切换到监视模式后是否打算断开WiFi连接?

来自分类Dev

安装CUDA后无法在16.04的Nvidia X Server上切换到性能模式

来自分类Dev

切换到其他页面而不重新加载?

来自分类Dev

切换到其他页面而不重新加载?

来自分类Dev

如果在传统模式下安装Windows 10后切换到UEFI模式会怎样?

来自分类Dev

切换到其他模式对话框且不重叠时如何关闭相应的模式对话框-使用Bootsrap 3

来自分类Dev

将交换链切换到窗口模式

来自分类Dev

在lldb中切换到Objective-C模式

来自分类Dev

Vim删除视觉选择并切换到插入模式

来自分类Dev

无法在Linux中使用fcntl切换到阻止模式

来自分类Dev

JavaScript:将CSS切换到暗模式

来自分类Dev

如何使用NDIS切换到监视模式?

来自分类Dev

如何在readline中切换到vi编辑模式?

来自分类Dev

使bash脚本切换到交互模式并给出提示

来自分类Dev

在vi和unix中切换到输入模式

来自分类Dev

JavaScript:将CSS切换到暗模式

来自分类Dev

将任务列表切换到评论模式

Related 相关文章

热门标签

归档