繁体   English   中英

如何创建独立的非模态对话框

[英]How to create an independent non-modal dialog

我正在尝试扩展此解决方案非模态对话框

from PyQt5 import QtWidgets
dialog = None


class Dialog(QtWidgets.QDialog):
    def __init__(self, *args, **kwargs):
        super(Dialog, self).__init__(*args, **kwargs)
        self.setWindowTitle('A floating dialog')
        self.resize(250,250)


class Window(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        button = QtWidgets.QPushButton('Open Dialog', self)
        button.clicked.connect(self.handleOpenDialog)
        self.resize(300, 200)
        self._dialog = None
        global dialog
        dialog = Dialog(self)
        dialog.show()

    def handleOpenDialog(self):
        if self._dialog is None:
            self._dialog = QtWidgets.QDialog(self)
            self._dialog.resize(200, 100)
        self._dialog.exec_()


if __name__ == '__main__':

    import sys
    app = QtWidgets.QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())

如果标题不相关,请道歉。 我想要一个独立于所有现有窗口/对话框的对话框/窗口,并且可以始终与之交互,即应用程序窗口/任何对话框的 GUI 循环不会阻止此非模型对话框。 为简单起见,我在上面的代码片段中使用了全局变量dialog ,它将保存非模态对话框实例。

当上面的程序运行时,主要的 window 和非模态对话框一起出现,这两个对话框都是用户交互的,但是当单击按钮时, self._dialog的 GUI 循环开始,用户不能再与浮动对话框和应用程序 window。我想要的是能够与dialog交互,但不能与Window

我想要类似于以下示例的行为:

在此处输入图像描述

我从主 window 打开了帮助对话框,然后我打开了一个非模态对话框,它出现在主 window 的顶部,并且无法与主 window 交互,但仍然不会阻止帮助对话框/窗口并允许用户与这个非模态 window 即示例中的帮助对话框。

当使用exec()打开对话框时,它将默认为application-modal 这意味着它将阻止应用程序中的所有其他 windows,无论它们是否是其他 windows 的父级。 要为一个window 制作一个模态对话框,它必须是 window 的父级,并且还必须将其模态显式设置为window-modal

对于相对于所有其他 windows(及其任何模态对话框)而言完全非模态的对话框,它必须没有父级,然后使用show()打开。 然而,这样做的一个副作用是它不会在主窗口关闭时自动关闭。 要解决此问题,可以在主窗口的closeEvent()中明确关闭它。

这是一个实现上述所有内容的简单演示:

import sys
from PyQt5 import QtCore, QtWidgets

class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Main Window')
        self.setGeometry(400, 100, 300, 200)
        self._help_dialog = None
        self._other_dialog = None
        self.buttonHelp = QtWidgets.QPushButton('Open Help')
        self.buttonHelp.clicked.connect(self.handleOpenHelp)
        self.buttonDialog = QtWidgets.QPushButton('Open Dialog')
        self.buttonDialog.clicked.connect(self.handleOpenDialog)
        layout = QtWidgets.QHBoxLayout(self)
        layout.addWidget(self.buttonDialog)
        layout.addWidget(self.buttonHelp)
        self.handleOpenHelp()

    def handleOpenDialog(self):
        if self._other_dialog is None:
            self._other_dialog = QtWidgets.QDialog(self)
            self._other_dialog.setWindowModality(QtCore.Qt.WindowModal)
            self._other_dialog.setWindowTitle('Other Dialog')
            self._other_dialog.resize(200, 100)
        self._other_dialog.exec_()

    def handleOpenHelp(self):
        if self._help_dialog is None:
            self._help_dialog = QtWidgets.QDialog()
            self._help_dialog.setWindowTitle('Help Dialog')
            self._help_dialog.setGeometry(750, 100, 250, 250)
        self._help_dialog.show()

    def closeEvent(self, event):
        if self._help_dialog is not None:
            self._help_dialog.close()

if __name__ == '__main__':

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM