中心子 QMainWindow 相对于父 QMainWindow

Posted

技术标签:

【中文标题】中心子 QMainWindow 相对于父 QMainWindow【英文标题】:Center Child QMainWindow Relative to Parent QMainWindow 【发布时间】:2019-06-30 06:09:32 【问题描述】:

重点是这部分代码:

prect = self.parent.rect() # <===
prect1 = self.parent.geometry() # <===
center = prect1.center() # <===
self.move(center) # <===

当我使用prect.center() 时,它会将框正确地居中在中心,但是如果我移动窗口并使用菜单(操作> 显示窗口2),Window2 不会显示相对于父窗口居中。

当我使用prect1.center() 时,它不会正确居中框(Window2 的左上角坐标在中心)但如果我将父窗口移动到其他位置,它会相对于父窗口移动。

问题:如何更改我的代码以在Window 的中心显示Window 相对于屏幕上Window 的位置?

可重现的代码示例:

import sys
from PyQt5 import QtGui
from PyQt5.QtWidgets import (QApplication, QMainWindow, QAction)

class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.top = 100
        self.left = 100
        self.width = 680
        self.height = 500
        self.setWindowTitle("Main Window")
        self.setGeometry(self.top, self.left, self.width, self.height)

        menu = self.menuBar()
        action = menu.addMenu("&Action")
        show_window2 = QAction("Show Window2", self)
        action.addAction(show_window2)
        show_window2.triggered.connect(self.show_window2_centered)

        self.show()

    def show_window2_centered(self):                                             
        self.w = Window2(parent=self)
        self.w.show()

class Window2(QMainWindow):
    def __init__(self, parent=None):
        self.parent = parent
        super().__init__()
        self.setWindowTitle("Centered Window")

        prect = self.parent.rect() # <===
        prect1 = self.parent.geometry() # <===
        center = prect1.center() # <===
        self.move(center) # <===
        print(prect)
        print(prect1)
        print(center)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    sys.exit(app.exec())

目前看起来像这样:

希望它相对于主窗口居中:

【问题讨论】:

你是想一开始就专注,还是想一直居中? 专注于开头。当我单击菜单中的“显示 Window2”命令时,我只希望它居中 - 相对于主窗口。 【参考方案1】:

第一个self.w 不是Window 的子代,因为您没有将该参数传递给super()。另一方面,move() 不会将小部件置于该位置的中心,它所做的是左上角位于该位置。

解决方案是使用另一个元素的几何图形来修改几何图形,因为它们都是窗口:

class Window2(QMainWindow):
    def __init__(self, parent=None):
        self.parent = parent
        super().__init__()
        self.setWindowTitle("Centered Window")

        geo = self.geometry()
        geo.moveCenter(self.parent.geometry().center())
        self.setGeometry(geo)

【讨论】:

不错!我可能会在接下来的几个小时里研究这三行。感谢您的帮助。 @Jarad 你必须区分几何和矩形,几何是指相对于父级的矩形,如果它有它,如果它没有它,它将相对于屏幕,矩形指自己。如果您希望一个矩形相对于另一个矩形居中,则中心必须相同

以上是关于中心子 QMainWindow 相对于父 QMainWindow的主要内容,如果未能解决你的问题,请参考以下文章

子视图相对于父 UIView 的起源

子对象相对于父对象的旋转

JS如何判断元素相对于父窗口的绝对位置?

以子菜单项相对于父菜单项将块居中

CSS Flexbox - 相对于父元素居中所有具有全高的子元素[重复]

如何通过CSS使得子控件相对于父控件居中