PyQt5让QDialog在允许用户输入之前等待进程完成

Posted

技术标签:

【中文标题】PyQt5让QDialog在允许用户输入之前等待进程完成【英文标题】:PyQt5 Make QDialog wait for a process to finish before allowing user input 【发布时间】:2020-03-16 08:50:19 【问题描述】:

在搜索了一段时间并找到了很多 PyQt4 的结果后,我无法转换自己,我需要一些帮助来解决我的应用程序需要的状态窗口。

该窗口在进程启动时打开,并且不应允许用户在主 GUI 中进行任何进一步的输入,并且用户在进程完成并激活关闭按钮之前不能关闭它。

到目前为止,我用 QDialog 尝试了这个并省略了框架(仍然需要捕获“ESC”键),但我相信有更好的解决方案。我的代码:

def resultWindow(self):
    self.resultBox = QDialog(self)
    self.resultBox.setWindowTitle("Please Wait")

    self.OkButton = QtWidgets.QPushButton(self.resultBox)
    self.OkButton.setText("Ok")
    self.OkButton.setEnabled(False)
    self.OkButton.clicked.connect(self.OkButton_clkd)
    self.resultBox.setWindowFlags(QtCore.Qt.CustomizeWindowHint | QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool)
    self.resultBox.exec_()

def OkButton_clkd(self):
    self.resultBox.close()

那么,更聪明的方法是什么?

【问题讨论】:

【参考方案1】:

除了完全移除框架,这也会阻止用户移动或调整对话框大小,您可以通过执行类似的操作从标题栏中移除关闭按钮

self.resultBox.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowStaysOnTopHint| 
                              QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint)

要捕获对话框的转义键,您可以安装一个事件过滤器,例如

def resultWindow(self):
    self.resultBox = QtWidgets.QDialog(self)
    self.resultBox.installEventFilter(self)
    ....

def eventFilter(self, object, event):
    if (object == self.resultBox and 
            event.type() == QtCore.QEvent.KeyPress and 
            event.key() == Qt.Key_Escape):
        return True
    return super().eventFilter(object, event)

或者你可以继承 QDialog 并覆盖 keyPressEvent()

【讨论】:

感谢 eventFilter sn-p。问题:是否可以一次阻止所有“退出”键/组合?还有 ALT+F4 并且可能是特定于操作系统的...?

以上是关于PyQt5让QDialog在允许用户输入之前等待进程完成的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5 - 显示来自不同类的 QDialog

在对话框之间切换(QDialog)PyQt5

PyQt5快速入门PyQt5基本窗口组件

PyQt5 QDialog 在后续线程中

PyQt5控制 窗口和显示窗口

关闭后执行的 PyQt5 QDialog 代码