как центрировать Qt mainform на экране?

Я пробовал это в конструкторе моей mainform:

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

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

но оба помещают нижний правый угол формы примерно в центр экрана, вместо центрирования формы. Есть идеи?

6 ответов


Я пробовал их в конструкторе моей mainform

это, вероятно, проблема. Вероятно, на данный момент у вас нет допустимой информации о геометрии, потому что объект не отображается.

когда объект впервые построен, он по существу расположен на (0,0) С ожидается (width,height), например:

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

но, после того, как показано ниже:

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

таким образом, вы еще не можете положиться на свой frameGeometry() информация.

редактировать: С учетом сказанного, я полагаю, вы можете легко перемещать его по желанию, но для полноты я падаю в Патрис код который не зависит от информации геометрии кадра:

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

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

функция перемещения (см. QWidget doc) принимает один QPoint или два int в качестве параметра. Это соответствует координатам верхнего левого угла вашего виджета (относительно его родителя; здесь OS Desktop). Попробуйте:

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

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

#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


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);   

availableGeometry() устарела.

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

другое решение, предполагая, что рассматриваемое окно 800×800:

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