如何在 PyQt 中将 new window 相对于 mainwindow 居中?
How to center new window relative to mainwindow in PyQt?
如何更改我的代码以相对于 MainWindow
在屏幕上的任何位置在 MainWindow
的中心显示 Loading
?
它现在做的是将Loading动画放在左上角,忽略MainWindow的位置。
即使我将几何体添加到主窗口,结果也是一样的。
这是代码,两个 类 都是从 py.file:
导入的
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.loading = Loading(parent=self)
self.ui.check.clicked.connect(self.show_animation)
self.show()
def show_animation(self):
self.loading.show()
class Loading(QWidget):
def __init__(self, parent=None):
self.parent = parent
QWidget.__init__(self)
self.ui = Ui_loading()
self.ui.setupUi(self)
self.setWindowModality(QtCore.Qt.ApplicationModal)
self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
self.label_animation = QLabel(self)
self.label_animation.setGeometry(QtCore.QRect(25, 25, 256, 256))
self.movie = QMovie('giphy1.gif')
self.label_animation.setMovie(self.movie)
self.movie.start()
geo = self.geometry()
geo.moveCenter(self.parent.geometry().center())
self.setGeometry(geo)
您的代码不起作用,因为您在创建 Loading
实例时已经设置了几何体,这太早了:不仅在您单击按钮时,父级 window 已被移动或调整大小,但您创建的实例甚至还没有显示,因此它仍然具有默认几何形状(通常为 640x480,除非它具有基于其内容的最小或最大尺寸限制)。
为了使小部件在父级上居中,您必须考虑何时显示。
class Loading(QWidget):
# ...
def showEvent(self, event):
if not event.spontaneous():
geo = self.geometry()
geo.moveCenter(self.parent.geometry().center())
QtCore.QTimer.singleShot(0, lambda: self.setGeometry(geo))
检查 event.spontaneous()
是为了仅在 window 明确显示时移动它(使用 show()
或 setVisible(True)
),否则它会发生在任何情况下,例如在 window 最小化后恢复
延迟 setGeometry()
是必需的,因为在某些情况下(最常见的是 Linux)Qt 向底层 window 系统发出请求和 window实际上映射在屏幕上。
如何更改我的代码以相对于 MainWindow
在屏幕上的任何位置在 MainWindow
的中心显示 Loading
?
它现在做的是将Loading动画放在左上角,忽略MainWindow的位置。
即使我将几何体添加到主窗口,结果也是一样的。
这是代码,两个 类 都是从 py.file:
导入的class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.loading = Loading(parent=self)
self.ui.check.clicked.connect(self.show_animation)
self.show()
def show_animation(self):
self.loading.show()
class Loading(QWidget):
def __init__(self, parent=None):
self.parent = parent
QWidget.__init__(self)
self.ui = Ui_loading()
self.ui.setupUi(self)
self.setWindowModality(QtCore.Qt.ApplicationModal)
self.setWindowFlag(QtCore.Qt.FramelessWindowHint)
self.label_animation = QLabel(self)
self.label_animation.setGeometry(QtCore.QRect(25, 25, 256, 256))
self.movie = QMovie('giphy1.gif')
self.label_animation.setMovie(self.movie)
self.movie.start()
geo = self.geometry()
geo.moveCenter(self.parent.geometry().center())
self.setGeometry(geo)
您的代码不起作用,因为您在创建 Loading
实例时已经设置了几何体,这太早了:不仅在您单击按钮时,父级 window 已被移动或调整大小,但您创建的实例甚至还没有显示,因此它仍然具有默认几何形状(通常为 640x480,除非它具有基于其内容的最小或最大尺寸限制)。
为了使小部件在父级上居中,您必须考虑何时显示。
class Loading(QWidget):
# ...
def showEvent(self, event):
if not event.spontaneous():
geo = self.geometry()
geo.moveCenter(self.parent.geometry().center())
QtCore.QTimer.singleShot(0, lambda: self.setGeometry(geo))
检查 event.spontaneous()
是为了仅在 window 明确显示时移动它(使用 show()
或 setVisible(True)
),否则它会发生在任何情况下,例如在 window 最小化后恢复
延迟 setGeometry()
是必需的,因为在某些情况下(最常见的是 Linux)Qt 向底层 window 系统发出请求和 window实际上映射在屏幕上。