Установка родителя для QMessageBox - PullRequest
3 голосов
/ 20 июля 2011

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

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

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

Ответы [ 5 ]

6 голосов
/ 20 июля 2011

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

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

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

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

Однако, есть еще!

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

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

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

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

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

2 голосов
/ 20 июля 2011

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

2 голосов
/ 20 июля 2011

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

1 голос
/ 20 июля 2011

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

0 голосов
/ 29 июля 2011

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

...