如何在 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实际上映射在屏幕上。