2017-02-19 30 views
1

У меня есть этот пример код:Как центрировать QDialog в QT?

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

Но диалог не сосредоточен на его родителях. Заранее спасибо.

UPDATE:

Я звоню Диалог из конструктора в 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(); 

} 

Но я получаю:

enter image description here

+0

http://www.qtcentre.org/threads/43802-Centering-child-window-in-parent http://stackoverflow.com/questions/18385916/how-to-keep-a-qwidget-or -qdialog-centered-to-its-parent-widget –

+0

Возможный дубликат [Как сохранить QWidget (или QDialog) в центре его родительского виджета?] (http://stackoverflow.com/questions/18385916/how-to- keep-a-qwidget-or-qdialog-center-to-its-parent-widget) –

ответ

2

У меня есть этот код в 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); 
    } 
} 

Надеется, что это помогает

0

Вы должны изменить геометрию QDialog :

dialog->move(x() + (width() - dialog->width())/2, 
      y() + (height() - dialog->height())/2); 

Функция move() поддерживает отношение родителя, поэтому нет необходимости сопоставлять ее с глобальным.

В конструкторе положение и размер родителя еще не установлены. Вы можете попробовать выполнения диалогового окна в отдельном методе или, в случае необходимости на конструкторе, попробуйте что-то вроде

QTimer::singleShot(0, [=]() { 
    // ... your dialog code 
}); 

будет показано на следующей итерации цикла обработки событий.

+0

Спасибо, я обновил свой вопрос, диалог не работает правильно. :( –

-1

Я думаю, что это ошибка Qt4. Я использовал Qt4 на Ubuntu и не уважал родительский центр виджетов.

Однако, когда я использую Qt5, он работает нормально.

Вы также можете использовать move(), чтобы прибыть в ваше положение.