2017-02-19 233 views
1

私はこのコード例があります。QTでQDialogを中央に配置する方法は?

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

をしかしダイアログは、彼の親を中心とされていません。前もって感謝します。

UPDATE:

私はメインウィンドウで、コンストラクタからのダイアログを呼び出しています:

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を中心とする親ウィジェット –

+0

[QWidget(またはQDialog)を親ウィジェットの中央に置く方法は?](http://stackoverflow.com/questions/18385916/how-to-親ウィジェットを中心に保つ) –

答えて

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

にこのコードを持っているが、それは私がそれはQt4をバグだと思う

0

あなたはQDialogのジオメトリを変更する必要があります:

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

move()関数は親を尊重して移動するので、グローバルにマップする必要はありません。

コンストラクタで、親の位置とサイズがまだ設定されていません。あなたは別の方法でダイアログを実行しようとか、コンストラクタに必要であれば、それはイベントループの次の反復に表示されます

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

ような何かを試すことができます。

+0

ありがとう、私の質問を更新しました、ダイアログが正しく動作しません。 :( –

-1

に役立ちます願っています。私はUbuntuでQt4を使用していましたが、親ウィジェットセンターを尊重しません。

しかし、Qt5を使用するとうまくいくようです。

また、move()を使用して自分の位置に到着することもできます。

関連する問題