1

アプリに Qt5 Creator を使用しており、メイン ウィンドウのコンストラクターでthis->setWindowState(Qt::WindowMaximized). ウィンドウが最初に最大化されたとき、ラジオ ボタンとチェック ボックスは正常に機能します (つまり、オンとオフを簡単に切り替えることができます)。

ただし、最小化して最大化すると、ラジオ ボタンとチェック ボックスがフリーズしたように見え、自由に切り替えられません。しかし、もう一度復元すると、問題はなくなります。

ラジオ ボタンとチェック ボックスのスロットにa を含めようとしthis->updateましたが、うまくいきませんでした。どんな助けでも大歓迎です。

4

3 に答える 3

5

私は同様の問題に遭遇しました

環境: Windows7 + Qt5.3 + フレームレス QMainWindow

私がやったこと:最小化されたウィンドウをQMainWindow::showMinimizedもう一度表示しました。

何が起こったか:ウィンドウの再描画が停止しました。凍りついたようだった。

私はそれをデバッグしていて、次のことがわかりました:

ウィンドウ属性Qt::WA_Mappedを最小化した後、QMainWindow から削除されました (ブレークポイントを設定setAttribute_internalqwidget.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 と言及されている) が解決されたようですが、その周りにいくつかの問題が残っていました。

于 2015-02-04T22:10:15.760 に答える
0

使用this->setWindowState(Qt::WindowMaximized);すると、ウィンドウの他の状態プロパティをオーバーライドしている可能性があります。特に、を削除してQt::WindowActiveいます。したがって、次のいずれかを使用します

this->setWindowState(this->windowState() | Qt::WindowMaximized);
this->setWindowState(Qt::WindowMaximized | Qt::WindowActive);

しかし、なぜあなたはウィンドウの状態で遊んでいるのだろうか。show()コンストラクターでウィンドウを表示するために使用できませんか?

于 2013-01-28T08:54:54.860 に答える
0

this->showMaximized()代わりに試してください。ウィンドウ状態は、他のメソッドでは不可能なトリッキーなことを行うために利用できますが、別のメソッドが必要な機能 (この場合は QWidget::showMaximized()) を提供する場合は、代わりにそれを使用します。

于 2013-01-29T13:10:45.760 に答える