我遇到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()作为父对象传递给对话框构造函数会导致以主窗口为中心的对话框。那么为什么这样以及如何追查问题呢?
答案 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 (例如,在父构造函数中),该对话框将显示在不可预测的位置(或者至少,不是你期望它展示的地方)。 但是,如果在显示父项后创建对话框,则会获得预期的行为。 例如,如果您有一个按钮来调用对话框。按钮和对话框都是同一个窗口小部件的子窗口,因此对话框父窗口与按钮父窗口相同。在这种情况下,建议延迟创建对话框直到单击按钮,而不是在此之前。 这样,您可以确保仅在显示父对象后才创建对话框。