PyQT中的弹出式、非模态内联对话框

4 投票
2 回答
10032 浏览
提问于 2025-04-17 05:25

我想做的事情有点难以描述,所以我来直接说说我的需求:

- 我希望点击一个按钮后能弹出一个对话框。

- 这个对话框应该是非模态的,也就是说它不会阻止我与其他窗口互动。

- 我还希望这个对话框能和主应用程序“锁定”在一起,也就是说如果我移动主应用,这个对话框也会跟着移动。

看起来我想要的有点像一个内联弹出窗口,但我不太确定这是不是正确的说法,或者我该如何解决这个问题。所以,PyQt的高手们,你们会怎么做呢?提前谢谢你们!

2 个回答

1

对于Qt5:

我不太清楚为什么 dialog.setWindowModality(QtCore.Qt.NonModal) 这个设置不起作用,不过

dialog.run()
dialog.exec_()

这样做就可以了。run 会让对话框变成非模态的,而 exec_ 会让对话框一直停在那里,直到用户输入内容。

5

要打开一个不带模式的对话框,可以使用 show() 方法,而不是使用 exec_() 方法。

为了确保这个对话框和它的父应用程序是“锁定在一起”的,可以在对话框的构造函数中设置一个父窗口。

from PyQt4 import QtGui

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

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

if __name__ == '__main__':

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

撰写回答