как установить ширину и высоту QDialog и разрешить автоматическое размещение окна

Есть ли способ просто инициализировать ширину и высоту QDialog и не изменять координаты x и y без использования файла пользовательского интерфейса? У меня просто есть простой QDialog, и я хочу установить только ширину и высоту, а x и y автоматически установить в центр родителя, но когда я пытаюсь установить setGeometry, унаследованные геометрические x и y равны 0. Как x и y устанавливается, когда диалог создается с использованием файла пользовательского интерфейса?

class MyDialog : public QDialog
{
    MyDialog::MyDialog(QWidget *parent) :
        QDialog(parent)
    {
        setGeometry(geometry().x(), geometry().y(), 200, 400);
    }
}

person Alex    schedule 07.02.2014    source источник
comment
Попробуйте изменить размер вместо setGeometry, изменение размера должно работать так, как вы ожидали: qt-project.org/doc/qt-5/qwidget.html#size-prop   -  person Zlatomir    schedule 07.02.2014
comment
хорошо, это работает, но x и y не центрируются в зависимости от новой ширины и высоты.   -  person Alex    schedule 07.02.2014


Ответы (3)


Используйте с resize вместо setGeometry, это должно работать как вы ожидали.

person Zlatomir    schedule 07.02.2014
comment
правильно, но теперь диалоговое окно выглядит так, как будто оно было открыто и кто-то изменил его размер. он не центрирован, как если бы он был создан с помощью дизайнера пользовательского интерфейса. - person Alex; 07.02.2014

У меня есть лучшее решение:

class MyDialog : public QDialog
{
    MyDialog::MyDialog(QWidget *parent) :
        QDialog(parent)
    {
        int nWidth = 300;
        int nHeight = 400;
        if (parent != NULL)
            setGeometry(parent->x() + parent->width()/2 - nWidth/2,
                parent->y() + parent->height()/2 - nHeight/2,
                nWidth, nHeight);
        else
            resize(nWidth, nHeight);
    }
}
person Alex    schedule 07.02.2014

Я хотел бы расширить ваше решение, чтобы оно работало также в системах со вторым монитором (даже если это старый поток...):

...
if (parent != NULL)
    QPoint parentPos = parent->mapToGlobal(parent->pos());
    setGeometry(parentPos.x() + parent->width()/2 - nWidth/2,
                parentPos.y() + parent->height()/2 - nHeight/2,
                nWidth, nHeight);
else
...

Марсель

person Marcel    schedule 03.06.2016