столкнулся с похожей проблемой
Среда: Windows7 + Qt5.3 + бескаркасный QMainWindow
Что я сделал: свернул окно с QMainWindow::showMinimized
, а затем снова отобразил его.
Что произошло: окно перестало перерисовываться. Оно выглядело замороженным.
Я отлаживал его и обнаружил следующее:
После минимизации атрибут окна Qt::WA_Mapped
был удален из QMainWindow (вы можете установить точку останова на setAttribute_internal
в qwidget.cpp
, чтобы проверить это). Но этот атрибут больше не устанавливался после показа окна. Это привело к тому, что условие if (discardSyncRequest(tlw, tlwExtra))
в QWidgetBackingStore::sync
не было выполнено, и это привело к тому, что dirtyWidgets
не были очищены. В другой части системы обновления Qt это привело к тому, что другой рендеринг не производился.
Мой обходной путь: подкласс QMainWindow
и установка атрибута Qt::WA_Mapped
вручную при восстановлении окна (обработка changeEvent):
void MainWindow::changeEvent(QEvent *event) {
if(event->type() == QEvent::WindowStateChange) {
if(!isMinimized()) {
setAttribute(Qt::WA_Mapped);
}
}
}
Это работает для меня хорошо. Правильным решением, вероятно, будет исправление ошибки в Qt.
Подробнее о проблеме
Я нашел аналогичную ошибку в истории проекта Qt (помечен как закрытую): QTBUG-34147
Также аналогичный вопрос на форуме Qt: Минимизация безрамочных окон...
Я нашел этот комментарий рядом с упомянутым условием в QWidgetBackingStore::sync
// If the top-level is minimized, it's not visible on the screen so we can delay the
// update until it's shown again. In order to do that we must keep the dirty states.
// These will be cleared when we receive the first expose after showNormal().
// However, if the widget is not visible (isVisible() returns false), everything will
// be invalidated once the widget is shown again, so clear all dirty states.
Кажется, в ядре Qt была ошибка (может быть, упомянутая QTBUG-34147), которая была решена, но вокруг нее остались некоторые проблемы.
person
Johnny Thunderman
schedule
04.02.2015