Подтвердить что ты не робот

Окно скрыто, хотя 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.

4b9b3361

Ответ 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

Ответ 5

Уродливое обходное решение (проверенное и работающее), добавьте его сразу после event- > ignore():

QTimer::singleShot(0,this,SLOT(hide()));
QTimer::singleShot(100,this,SLOT(show()));