QDialog未正确定位

时间:2014-03-21 13:33:07

标签: c++ qt

我遇到QDialog问题,它没有以父窗口为中心显示。 以下代码段解释了它:

void MyWidget::showDialog() {
    QObject* p = parent();
    while (p!=0) {
        qDebug() << p;
        p = p->parent();
    }
    qDebug() << QApplication::activeWindow();

    MyClassDerivedFromQDialog dlg( this );
    if ( dlg.exec() != dlg.Accepted ) {
        return;
    }
    ... do something
}

qDebug上的输出如下

QSplitter(0x2d89930, name = "splitter") 
MyWidget(0x2d89670, name = "widget") 
MainWindow(0x27ef20, name = "application")
MainWindow(0x27ef20, name = "application")

执行我的示例会在屏幕上的某个位置打开对话框。将QApplication :: activeWindow()作为父对象传递给对话框构造函数会导致以主窗口为中心的对话框。那么为什么这样以及如何追查问题呢?

3 个答案:

答案 0 :(得分:0)

我不确定是否理解你的问题。

QDialogs始终以您作为父级传递的小部件为中心。这是设计的。所以,如果你通过&#34; activeWindow()&#34;作为父级,它以活动窗口为中心。如果你通过&#34;这个&#34;作为父级,对话框位于MyWidget上方。

您的对话以哪种方式不遵守这些规则?

答案 1 :(得分:0)

Dialog类通过

实例化
MyClassDerivedFromQDialog::MyClassDerivedFromQDialog(QWidget *parent) 
: QDialog(parent), 
  ui(new Ui::MyClassDerivedFromQDialog) 
{ 
    ui->setupUi(this); 

    //remove the ? button in titlebar 
    Qt::WindowFlags flags = windowFlags(); 
    Qt::WindowFlags helpFlag = Qt::WindowContextHelpButtonHint; 
    flags = flags & (~helpFlag); 
    setWindowFlags(flags); 
} 

我总是在初始帖子中的showDialog函数中使用它。有时候它有效...而且,不,我没有两个MyWigets是彼此的父母。

答案 2 :(得分:0)

我发现这种行为与对话框创建的时间有关。 如果在之前创建了一个QDialog(或派生类),则会显示对话框 parent (例如,在父构造函数中),该对话框将显示在不可预测的位置(或者至少,不是你期望它展示的地方)。 但是,如果在显示父项创建对话框,则会获得预期的行为。 例如,如果您有一个按钮来调用对话框。按钮和对话框都是同一个窗口小部件的子窗口,因此对话框父窗口与按钮父窗口相同。在这种情况下,建议延迟创建对话框直到单击按钮,而不是在此之前。 这样,您可以确保仅在显示父对象后才创建对话框。