QDialog расположен неправильно

0

У меня проблема с 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
    На каких системах у вас возникла эта проблема?
Теги:
qt

3 ответа

0

Я обнаружил, что это поведение связано с временем создания диалога. Если вы создадите QDialog (или производный класс) до отображения родителя диалога (например, в родительском конструкторе), диалог отображается в непредсказуемом месте (или, по крайней мере, не там, где вы ожидаете, что он покажет). Однако, если диалог создается после отображения родителя, вы получите ожидаемое поведение. Например, если у вас есть кнопка вызова вашего диалога. И кнопка, и диалог являются дочерними элементами одного и того же виджета, поэтому родительский диалог совпадает с родительским элементом. В этом случае рекомендуется отложить создание диалога до тех пор, пока не будет нажата кнопка, а не до этого. Таким образом, вы гарантируете, что диалог будет создан только после отображения родительского элемента.

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, которые являются родителями друг друга.

  • 0
    Это то, что вы должны проверить (я не могу видеть это в предоставленном коде): Почему ваш отладочный вывод показывает предка «MyWidget», а вы думаете, что это не так ?! Есть ли экземпляр MyWidget, который вы не намеревались создать? Является ли виджет родителем самого себя? Распечатайте «this» в MyWidget :: showDialog (), чтобы сравнить адреса.
  • 0
    где ты видишь предка MyWidget? есть два MainWindows, но это из-за QApplication :: activeWindow (), записанного в выходные данные отладки
0

Я не знаю, понимаете ли вы свою проблему.

QDialogs всегда сосредоточены на виджетах, которые вы передаете как родитель. Это по дизайну. Поэтому, если вы передаете "activeWindow()" в качестве родителя, оно сосредоточено в активном окне. Если вы передадите "это" в качестве родителя, диалог будет центрирован над MyWidget.

Каким образом ваш диалог не соблюдает эти правила?

  • 0
    В описании QDialog написано, что диалог сосредоточен на виджете верхнего уровня родителей, т.е. на главном окне. Я знаю, что описание его функции exec немного отличается. Со многими другими классами qdialog он работает отлично, и даже этот конкретный класс прекрасно работает в других местах. В любом случае, диалоговое окно, вызываемое из определенного местоположения, появляется не в родительском виджете, оно появляется в левой части экрана, половина его находится вне рабочего стола и далеко от окна приложения. Я использую QT 5.2 на Windows 7 64 бит.
  • 0
    Только чтобы убедиться: если вы передадите «this» в качестве родителя, вы получите диалоговое окно наполовину с рабочего стола?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню