私は同様の問題に遭遇しました
環境: 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 と言及されている) が解決されたようですが、その周りにいくつかの問題が残っていました。