如何在屏幕上居中Qt主变形?

时间:2010-08-06 14:51:48

标签: qt qt4 qt4.6

我在mainform的构造函数中尝试过这些:

QRect desktopRect = QApplication::desktop()->availableGeometry(this);
move(desktopRect.center() - frameGeometry().center());

QRect desktopRect = QApplication::desktop()->availableGeometry(this);
move(desktopRect.center() - rect().center());

但两者都将表单的右下角放在屏幕的中心附近,而不是将表单居中。有什么想法吗?

7 个答案:

答案 0 :(得分:10)

  

我在mainform的构造函数

中尝试过这些

这可能是问题所在。此时您可能没有有效的几何信息,因为该对象不可见。

首次构建对象时,它基本上位于(0,0),预期为(width,height),因此:

frame geometry at construction:  QRect(0,0 639x479) 

但是,在被展示后:

frame geometry rect:  QRect(476,337 968x507) 

因此,您还不能依赖frameGeometry()信息。

编辑:据说,我认为您可以根据需要轻松移动它,但为了完整性,我将放入Patrice's code,这不依赖于帧几何信息:

QRect desktopRect = QApplication::desktop()->availableGeometry(this);
QPoint center = desktopRect.center();

move(center.x() - width() * 0.5, center.y() - height() * 0.5);

答案 1 :(得分:4)

move函数(参见QWidget doc)将一个QPoint或两个int作为参数。这对应于Widget左上角的坐标(相对于其父级;此处为OS Desktop)。 尝试:

QRect desktopRect = QApplication::desktop()->availableGeometry(this);
QPoint center = desktopRect.center();

move(center.x()-width*0.5, center.y()-height*0.5);

答案 2 :(得分:1)

#include <QStyle>
#include <QDesktopWidget>

window->setGeometry(
    QStyle::alignedRect(
        Qt::LeftToRight,
        Qt::AlignCenter,
        window->size(),
        qApp->desktop()->availableGeometry()
    )
);

https://wiki.qt.io/How_to_Center_a_Window_on_the_Screen

答案 3 :(得分:1)

availableGeometry()已过时。

move(pos() + (QGuiApplication::primaryScreen()->geometry().center() - geometry().center()));

答案 4 :(得分:0)

PyQT Python版本

# Center Window
desktopRect = QApplication.desktop().availableGeometry(self.window)
center = desktopRect.center();
self.window.move(center.x()-self.window.width()  * 0.5,
                 center.y()-self.window.height() * 0.5);   

答案 5 :(得分:0)

移动(QGuiApplication::primaryScreen()->geometry().center() - rect().center());

答案 6 :(得分:-1)

另一个解决方案,假设有问题的窗口是800×800:

QRect rec = QApplication::desktop()->availableGeometry();
move(QPoint((rec.width()-800)/2, (rec.height()-800)/2));