子对话框没有出现在PyQt5中

时间:2016-07-27 11:10:30

标签: python pyqt pyside


嗨,我正在尝试使用PyQt5,Python 3.4和Windows 7制作简单的GUI应用程序。

下面的代码工作正常。

# coding: utf-8

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog


class MainWnd(QMainWindow):
    def __init__(self):
        super().__init__()
        self.popup_dlg = None
        self.init_ui()

    def init_ui(self):
        self.setGeometry(100, 100, 300, 200)
        self.show()

        self.popup_dlg = ChildWnd()


class ChildWnd(QDialog):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.resize(200, 100)
        self.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWnd()
    sys.exit(app.exec_())

创建了两个窗口。一个是主窗口,另一个是子窗口(弹出窗口)。 但我想要的是让子窗口的默认位置以主窗口为中心

所以我修改了这样的代码。

# coding: utf-8

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog


class MainWnd(QMainWindow):
    def __init__(self):
        super().__init__()
        self.popup_dlg = None
        self.init_ui()

    def init_ui(self):
        self.setGeometry(100, 100, 300, 200)
        self.show()

        self.popup_dlg = ChildWnd(self)  # make instance with parent window argument.


class ChildWnd(QDialog):

    def __init__(self, parent_wnd):
        super().__init__()
        self.setParent(parent_wnd)  # set child window's parent
        self.init_ui()

    def init_ui(self):
        self.resize(200, 100)
        self.show()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    mw = MainWnd()
    sys.exit(app.exec_())

但是这段代码会产生问题。子窗口不显示。仅显示主窗口(=父窗口)。在Qt的QDialog手册中,我发现了这一点。

  

但如果它有父项,则其默认位置居中于   父母的顶级小部件(如果它不是顶级小部件)。

这就是我添加 setParent()

的原因

我该怎么办?

请帮助我!!

1 个答案:

答案 0 :(得分:0)

根据documentation调用setParent中的说明,只会更改QDialog小部件的所有权。如果您希望QDialog窗口小部件在其父窗口中居中,则需要将父窗口小部件实例传递给QDialog的超级构造函数:

class ChildWnd(QDialog):

    def __init__(self, parent_wnd):
        super().__init__(parent_wnd)
        self.init_ui()

    def init_ui(self):
        self.resize(200, 100)
        self.show()