QDialog没有正确定位

QDialog not positioned correctly

本文关键字:定位 QDialog      更新时间:2023-10-16

我有一个问题,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()作为父类传递给对话框构造函数,会产生一个位于主窗口中心的对话框。那么,这是为什么?如何追踪问题呢?

我发现这种行为与对话框创建的时间有关。如果您在显示对话框之前创建了QDialog(或派生类)(例如,在父构造函数中),那么对话框将显示在一个不可预测的位置(或者至少不是您期望它显示的位置)。然而,如果对话框是在父元素显示之后创建的,那么您将得到预期的行为。例如,如果您有一个按钮调用您的对话框。按钮和对话框都是同一个小部件的子组件,因此对话框父组件与按钮父组件相同。在这种情况下,建议将对话框创建延迟到单击按钮,而不是在此之前。这样,您就可以确保只在显示父元素之后才创建对话框。

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

qdialog始终位于您作为父传递的小部件的中心。这是设计好的。因此,如果你传递"activeWindow()"作为父窗体,它将位于活动窗口的中心。如果你传递"this"作为父元素,对话框将位于MyWidget的中央。

你的对话在哪些方面不尊重这些规则?

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函数一样使用它。有时它有效……不,我没有两个mywiget,它们是彼此的父母。