Search code examples
c++qtqmainwindowqdialog

How to center a QDialog in QT?


I have this example code:

QDialog *dialog = new QDialog(this);
QPoint dialogPos = dialog->mapToGlobal(dialog->pos());
QPoint thisPos = mapToGlobal(this->pos());
dialog->exec();

But the Dialog is not centered on his parent. Thanks in advance.

UPDATE:

I'm calling Dialog from constructor in MainWindow:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{

    this->panelInferior = new WidgetTabsInferior;
    this->acciones = new Acciones(this);

    crearAcciones();
    crearBarraMenu();
    crearToolbar();
    crearTabsEditor();
    crearArbolDir();
    crearDockWindows();
    crearStatusBar();

    setWindowIcon(QIcon(":imgs/logo.png"));

    connect(this->pestanasEditor , SIGNAL(currentChanged(int)),this,SLOT(cambioTab(int)));

    this->dialogo = new AcercaDe(this);
    this->dialogo->move(x() + (width() - dialogo->width()) / 2,
                 y() + (height() - dialogo->height()) / 2);
    this->dialogo->show();
    this->dialogo->raise();
    this->dialogo->activateWindow();

}

But I get is:

enter image description here


Solution

  • I have this code in github

    inline void CenterWidgets(QWidget *widget, QWidget *host = 0) {
        if (!host)
            host = widget->parentWidget();
    
        if (host) {
            auto hostRect = host->geometry();
            widget->move(hostRect.center() - widget->rect().center());
        }
        else {
            QRect screenGeometry = QApplication::desktop()->screenGeometry();
            int x = (screenGeometry.width() - widget->width()) / 2;
            int y = (screenGeometry.height() - widget->height()) / 2;
            widget->move(x, y);
        }
    }
    

    Hope it helps

    edit

    fix the deprecation warning issued from recent Qt versions:

    #include <QScreen>
    #include <QWidget>
    #include <QGuiApplication>
    
    inline void CenterWidgets(QWidget *widget, QWidget *host = Q_NULLPTR) {
        if (!host)
            host = widget->parentWidget();
    
        if (host) {
            auto hostRect = host->geometry();
            widget->move(hostRect.center() - widget->rect().center());
        }
        else {
            QRect screenGeometry = QGuiApplication::screens()[0]->geometry();
            int x = (screenGeometry.width() - widget->width()) / 2;
            int y = (screenGeometry.height() - widget->height()) / 2;
            widget->move(x, y);
        }
    }