Закройте все виджеты в Qt, кроме некоторых

0

Я только начал работать над довольно сложным Qt-приложением. Меня беспокоит одна вещь. У нас есть функция "Автоматический выход", когда после определенного времени бездействия большая часть виджетов закрывается и отображается запрос на ввод. Это сделано с этим слотом:

foreach(QWidget *w, qApp->topLevelWidgets()) {
   if ( w != loginDialog &&
        w != mainWindow &&
        !w->objectName().isEmpty() &&
        (w->isWindow() ) ) {
        w->close();
   }
}

В основном он выполняет итерацию по всем виджетам, кроме LoginDialog и MainWindow. Кажется, что это работало нормально, пока мы не узнали, что это неправильно обрабатывает диалоговые окна Modal. Особенно такие диалоги, как QMessageBox::warning и т.д. Идея теперь итерации через модальные виджеты сначала, а затем поверх обычных виджетов. Как вы думаете, что это правильный путь?

UPD: Извините, но я должен отозвать свое согласие с ответом.

Моя проблема описана здесь https://blogs.kde.org/2009/03/26/how-crash-almost-every-qtkde-application-and-how-fix-it-0. Похоже, что запрос "Закрыть" обрабатывается в локальном цикле событий MessageBox. Я должен перефразировать мой вопрос: возможно ли выйти из цикла локальных событий (т.е. Закрыть MessageBox) и повторно отправить сигнал на главный цикл событий?

Теги:
qt

2 ответа

2
Лучший ответ

Поэтому я придумал решение, которое сначала закрывает модальные диалоги:

foreach(QWidget *w, qApp->topLevelWidgets()) {
   if ( w != loginDialog &&
    w != mainWindow &&
    w->isWindow() &&
    w->isModal() ) {
    w->close();
   }
}

Важно, что это !w->objectName().isEmpty() не включен, в противном случае анонимные MessageBoxes не будут обнаружены. Так как QWidget::close() использует deleteLater() внутри, кажется, что закрывает виджетов таким образом, и удаление корректно обрабатывается в цикле событий.

Я не могу использовать QApplication::activeModalWidget потому что мой loginDialog тоже модальный (но скрытый), и цикл через activeModalWidget заканчивается бесконечным циклом.

1

Используйте эти функции для получения других виджетов верхнего уровня, включая модальные диалоги:

QWidget * QApplication::activeModalWidget () [static]

QWidget * QApplication::activePopupWidget () [static]

Вы можете прочитать о них здесь http://qt-project.org/doc/qt-5/qapplication.html

  • 0
    Благодарю. Я понял, что решение в порядке, просто нужно сначала закрыть всплывающие окна и модалы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню