Как показать QMessageBox из константного метода QDialog? - PullRequest
3 голосов
/ 11 июля 2019

У меня есть подкласс QDialog, и я создал метод const, потому что я хочу определенно предотвратить изменения моего экземпляра. Теперь, если возникает определенная ошибка, я бы хотел использовать QMessageBox для ее отображения. Но я не могу использовать this в качестве родителя окна сообщения, потому что this - это const.

Это жаль. Согласно документации (https://doc.qt.io/qt-5/qdialog.html#QDialog) родитель влияет на местоположение нового диалога по умолчанию и на то, разделяет ли он запись родительской панели задач. Должен ли родитель обязательно быть не-1011 * для этого ...?

Я вижу три варианта, но ни один из них не является явно превосходным:

  • const_cast (мне кажется странным использовать const_cast в такой распространенной ситуации)
  • использовать nullptr в качестве родителя (некрасиво, потому что позиция в окне сообщения хуже)
  • делает мой метод неконстантным (безобразно, потому что компилятор больше не будет поддерживать меня в защите экземпляра)

Разве Qt не является константно-корректным, когда требует, чтобы родительский виджет был изменяемым? И есть ли лучшее решение, чем const_cast?

1 Ответ

1 голос
/ 11 июля 2019

Одна из причин введения ..._cast методов заключается в том, чтобы различать данные Castind и в то же время защищать от нежелательного преобразования, а также делать код более читабельным и облегчать поиск в коде.

Оператор const_cast - это именно то, что вам нужно. Метка const в методе означает, что ваши операции не будут изменять какие-либо данные о состоянии объекта. Однако для создания диалогового окна с предупреждением или любого окна требуется изменить многие состояния операционной системы и внутренних данных приложения. Вот почему это не постоянные операции.

Однако диалог оповещения о закрытии и закрытии не изменяет состояние данных вашего объекта и не касается вашей задачи. Таким образом, диалог создания и управления состоянием приложения не является постоянным. Но в понимании задачи, которую вы решаете в своем приложении, внешний вид диалогового окна оповещения - это операция const.

Следовательно, const_cast - это именно то, что вам нужно для объединения различных задач, где они пересекаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...