Основное внимание уделяется этой части кода:
prect = self.parent.rect() # <===
prect1 = self.parent.geometry() # <===
center = prect1.center() # <===
self.move(center) # <===
Когда я использую prect.center(), он правильно центрирует поле в центре, но если я перемещаю окно и использую меню (Действие > Показать окно2), Window2 не отображается по центру относительно родительского окна.
Когда я использую prect1.center(), он не центрирует поле правильно (верхняя левая координата Window2 находится в центре), но он перемещается относительно родительского окна, если я перемещаю родительское окно в другое место.
Вопрос: Как мне изменить свой код, чтобы отображать Window2 в центре 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())
В настоящее время выглядит так:
Хотелось бы, чтобы он был центрирован относительно главного окна:
Сфокусировался в начале. Я просто хочу, чтобы он был центрирован, когда я нажимаю команду «Показать окно2» в меню - относительно главного окна.






Во-первых, 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 Вы должны различать геометрию и прямоугольник, геометрия относится к прямоугольнику по отношению к родителю, если он у него есть, а если его нет, он будет относиться к экрану, а прямоугольник относится к самому себе. Если вы хотите, чтобы прямоугольник был центрирован по отношению к другому, необходимо, чтобы центр был таким же
Вы просто хотите сосредоточиться в начале или вы хотите быть в центре все время?