how to set QDialog width and height and allow automatic window placement

27,897

Solution 1

I have better solution:

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

Solution 2

Use with resize instead of setGeometry, it should work as you expected.

Solution 3

I'd like to extend your solution to work also on systems with a second monitor (even if this is an old thread...):

...
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
...

Marcel

Share:
27,897
Alex
Author by

Alex

Updated on July 16, 2022

Comments

  • Alex
    Alex almost 2 years

    Is there a way to just initialize a QDialog's width and height and not change the x and y coordinates without using a ui file? I just have a simple QDialog and want to set only the width and height, and have the x and y automatically set to the center of the parent, but when I try setGeometry, the inherited geometry's x and y are 0. How does the x and y get set when the dialog is created using a ui file?

    class MyDialog : public QDialog
    {
        MyDialog::MyDialog(QWidget *parent) :
            QDialog(parent)
        {
            setGeometry(geometry().x(), geometry().y(), 200, 400);
        }
    }
    
  • Alex
    Alex over 10 years
    right, but the dialog now looks like it was opened and someone resized it. it's not centered as it would be if it was created using the ui gui designer