Окно скрыто, хотя QCloseEvent игнорируется
В настоящее время я пытаюсь перенести приложение Qt на Mac OSX и столкнулся с следующей проблемой:
Один из моих оконных классов (полученный из QMainWindow) отображает диалоговое окно при нажатии кнопки закрытия, где вы можете сохранять/отменять изменения или прерывать. Это делается путем переопределения closeEvent следующим образом:
void ResultsWindow::closeEvent(QCloseEvent* event)
{
if (isWindowModified())
{
activateWindow();
QMessageBox::StandardButton button = QMessageBox::warning(
this,
APPLICATION_NAME,
"Warning: data have been modified. Do you want to save the "
"changes?",
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Abort,
QMessageBox::Abort);
switch (button)
{
case QMessageBox::Save:
if (!Save())
{
event->ignore();
return;
}
break;
case QMessageBox::Discard:
break;
case QMessageBox::Abort:
default:
event->ignore();
return;
}
}
event->accept();
}
Ожидаемое поведение выглядит следующим образом: если вы нажмете "Abort", событие будет проигнорировано, и окно останется открытым. Это работает как в Linux, так и в Windows. Однако в OSX окно скрыто, но все еще активно в фоновом режиме. Что мне здесь не хватает? Как я могу убедиться, что окно остается открытым?
Update:
Я почему-то думаю, что это проблема с Qt5. Если метод closeEvent
состоит только из event->ignore();
, окно остается закрытым. Я не думаю, что это предполагаемое поведение. Возможно, я должен опубликовать эту проблему в списке рассылки Qt...
Обновление:
Это была ошибка в Qt и решена с версии 5.1.
Ответы
Ответ 1
То же самое с Qt 5.0.0 или Qt 5.0.1.
Однако если вы установите WindowModality как ApplicationModal или WindowModal, он будет работать. Нажмите Cmd + Q, чтобы выйти и получить окно сообщения.
![windowModality in Qt Creator]()
Я предполагаю, что проблема связана с различиями между Mac OS X UI и другим пользовательским интерфейсом. Возможно, какая-то дополнительная работа над Qt позволит им решить проблему.
Даже если вы переопределите QMainWindow:: event(), вы получите тот же результат.
Ответ 2
У меня Qt 4.7 на Mac 10.7, и я не могу воспроизвести эту ошибку.
Я считаю, что просто show()
между макросом Q_OS_MAC
каждый раз, когда вы игнорируете event
, должен делать трюк. Что-то вроде этого:
event->ignore();
#ifdef Q_OS_MAC
show();
#endif
Это может быть не идеальное решение, но, безусловно, проблема для этой проблемы.
Ответ 3
вместо
case QMessageBox::Abort:
default:
event->ignore();
return;
попробуйте сделать
case QMessageBox::Abort:
event->ignore();
return;
default:
break
Ответ 4
Как только я получаю эту ошибку, я создал здесь отчет об ошибке: https://bugreports.qt-project.org/browse/QTBUG-30899
Ответ 5
Уродливое обходное решение (проверенное и работающее), добавьте его сразу после event- > ignore():
QTimer::singleShot(0,this,SLOT(hide()));
QTimer::singleShot(100,this,SLOT(show()));