嗨,我正在尝试使用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()。
的原因我该怎么办?
请帮助我!!
答案 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()