Настройка родителя для QMessageBox


Я не могу понять, в чем выгода установки parent для QMessageBox, например, в следующем коде:

void mainWindow::showMessage(QString msg) {
  QMesageBox::information(this, "title", msg); //'this' is parent
}

Может кто-нибудь помочь мне ?

5 3

5 ответов:

Вероятно, несколько вещей. Прежде всего QMessageBox наследует от QDialog. Поскольку QDialog имеет понятие родителя, QMessageBox тоже должен для согласованности.

В частности, в документации говорится:

Parent передается конструктору QDialog.

По крайней мере, новый диалог часто отображается по центру в верхней части своего родителя.

Однако есть и еще кое-что!

Согласно документации он может фактически влиять на функциональность. Например:

На Mac OS X, если вы хотите, чтобы ваше окно сообщения отображалось как Qt:: лист его родитель, установите модальность окна окна сообщения в Qt:: WindowModal или используйте open (). В противном случае окно сообщения будет стандартным диалогом.

Кроме того, существует понятие как "модальности окна", так и "модальности приложения", где первая предотвращает ввод только в Родительском окне, а вторая предотвращает ввод для всего приложения. Это, очевидно, требует концепции родителя, чтобы быть известный.

Наконец, для некоторых функций static, таких как ::about(...), первым местом, где он ищет значок, является parent->icon(). Таким образом, если вы хотите получить хорошее поведение для конкретной платформы и сделать свой код кроссплатформенным, вам лучше передать ему здравомыслящего родителя.

Иерархия диалоговых окон "родитель-потомок" определяет поведение стекирования окон на различных платформах. Если вы передадите dialog P в качестве родителя dialog C, C появится над P на всех (настольных) платформах. Если вы передадите 0, то укладка окон будет отличаться и, как правило, вести себя не так, как хотелось бы. Худшие такие проблемы я видел на OS X, где некоторые окна сообщений показывались за главным окном, которое было отключено, поскольку окна сообщений были модальными, без какого-либо способа добраться до окна сообщений (ни ярлыков ни перемещение окон с помощью мыши не помогло). Короче говоря, мое предложение: Всегда передайте разумному родителю.

Другие ответы, вероятно, лучше, но моя собственная маленькая причина заключается в том, что он помещает окно сообщения в центр родителя, а не в центр экрана...

Не забудьте упомянуть, что QMessageBox унаследует палитру и таблицы стилей своего родителя. Поверьте мне, когда вы используете пользовательские сложные таблицы стилей, вы не хотите, чтобы ваше сообщение всплывало, как будто оно не принадлежит вашему приложению ...

Он также полезен для управления памятью, если вы не используете статические функции, но фактически создаете экземпляр QMessageBox. Когда родитель будет удален, ваш экземпляр тоже будет удален.