У меня проблема с 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 (или производный класс) до отображения родителя диалога (например, в родительском конструкторе), диалог отображается в непредсказуемом месте (или, по крайней мере, не там, где вы ожидаете, что он покажет). Однако, если диалог создается после отображения родителя, вы получите ожидаемое поведение. Например, если у вас есть кнопка вызова вашего диалога. И кнопка, и диалог являются дочерними элементами одного и того же виджета, поэтому родительский диалог совпадает с родительским элементом. В этом случае рекомендуется отложить создание диалога до тех пор, пока не будет нажата кнопка, а не до этого. Таким образом, вы гарантируете, что диалог будет создан только после отображения родительского элемента.
Класс 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, которые являются родителями друг друга.
Я не знаю, понимаете ли вы свою проблему.
QDialogs всегда сосредоточены на виджетах, которые вы передаете как родитель. Это по дизайну. Поэтому, если вы передаете "activeWindow()" в качестве родителя, оно сосредоточено в активном окне. Если вы передадите "это" в качестве родителя, диалог будет центрирован над MyWidget.
Каким образом ваш диалог не соблюдает эти правила?