【问题标题】:PyQt5 Make QDialog wait for a process to finish before allowing user inputPyQt5让QDialog在允许用户输入之前等待进程完成
【发布时间】: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()

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

【问题讨论】:

    标签: python-3.x pyqt5 qdialog


    【解决方案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 并且可能是特定于操作系统的...?
    猜你喜欢
    • 2015-09-19
    • 2011-03-27
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2017-02-02
    • 1970-01-01
    相关资源
    最近更新 更多