重点是代码的这一部分:

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

当我使用prect.center()时,它会将框正确居中,但如果移动窗口并使用菜单(操作>显示窗口2),Window2不会相对于父窗口显示居中。
当我使用prect1.center()时,它不会正确居中(左上角的Window2坐标位于中心),但如果我将父窗口移到其他位置,它会相对于父窗口移动。
问题:如何更改我的代码,使其相对于屏幕上的任何位置,在Window2的中心显示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())

目前看起来是这样的:
python - 相对于父QMainWindow的中心子QMainWindow-LMLPHP
希望它相对于主窗口居中:
python - 相对于父QMainWindow的中心子QMainWindow-LMLPHP

最佳答案

第一个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)

关于python - 相对于父QMainWindow的中心子QMainWindow,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56822794/

10-10 07:39