首页 > 解决方案 > 在主窗口中显示一个对话框

问题描述

Hello!下面的代码在按下时会创建一个空对话框:

from PyQt5 import QtWidgets, QtCore

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        w = QtWidgets.QWidget()
        layout = QtWidgets.QVBoxLayout()
        w.setLayout(layout)
        self.setCentralWidget(w)

        toyButton = QtWidgets.QPushButton("Hello!")
        layout.addWidget(toyButton)
        toyButton.clicked.connect(self.showdialog)

    def showdialog(self):
        d = QtWidgets.QDialog()
        d.setWindowTitle("Dialog")
        d.setWindowModality(QtCore.Qt.WindowModal)
        d.exec_()

if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

如何强制对话框出现主窗口中,而不是让它作为一个独立的窗口浮动?

标签: pythonpython-3.xpyqt5qdialog

解决方案


您只需要给对话框一个父小部件:d = QtWidgets.QDialog(self.centralWidget()). self也是有效的父母;选择你最喜欢的!

您还可以添加d到布局self.centralWidget().layout().addWidget(d):尽管第二个不尊重您的方式+执行。

这是比较两种方法的完整代码:

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        w = QtWidgets.QWidget()
        layout = QtWidgets.QVBoxLayout()
        w.setLayout(layout)
        self.setCentralWidget(w)

        toyButton = QtWidgets.QPushButton("Hello!")
        layout.addWidget(toyButton)
        toyButton.clicked.connect(self.showdialog)

        toyButton2 = QtWidgets.QPushButton("Hello2!")
        layout.addWidget(toyButton2)
        toyButton2.clicked.connect(self.showdialog2)

    def showdialog(self):
        d = QtWidgets.QDialog(self.centralWidget())
        d.setWindowTitle("Dialog")
        d.setWindowModality(QtCore.Qt.WindowModal)
        d.exec_()

    def showdialog2(self):
        d = QtWidgets.QDialog()
        d.setWindowTitle("Dialog2")   # window title won't be seen...
        d.setWindowModality(QtCore.Qt.WindowModal)
        QtWidgets.QPushButton('Dialog2', parent=d) # ... so we add a little something
        self.centralWidget().layout().addWidget(d)
        d.exec_()

推荐阅读