3

QMainWindow を継承する MyWindow。MyWindow には、アニメーションを表示する QGLWidget が含まれています。

問題は、メニューを開くかウィンドウのサイズを変更するたびにアニメーションが一時停止することです。

アニメーションは、次のようQCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest))に定期的に呼び出してから、ウィンドウが を受け取るたびに再描画を呼び出すことによって実装されますQEvent::UpdateRequest

bool MyWindow::event(QEvent *event)
{
    qDebug() << event;
    switch (event->type())
    {
        case QEvent::UpdateRequest:
            render();
            return true;
        default:
            return QMainWindow::event(event);
    }
}

からわかるようqDebug()に、メニューが開いている間、またはウィンドウのサイズが変更されている間、ウィンドウは更新要求イベントの受信を停止します。

QMainWindow/QWidget に更新要求イベントを受信し続けるための設定はありますか? または、アニメーションを実装するためのより良い方法はありますか?

編集:私はMac OS Xを使用しています。

4

3 に答える 3

0

Qt GUI の更新は MainThread で実行されています。したがって、多くの GUI 機能を同時に使用している場合は、GUI の応答が遅くても問題ありません。したがって、一般的には、非常に多くの重い関数呼び出しで MaiThread をオーバーロードしないでください。

GUI の応答を高速化するための考えられる解決策。

  1. PostEvent が MainThread によって呼び出される場合 (メインの GUI スレッドからタイマーを使用している場合)、代わりにそれらをワーカー スレッドのバックエンド機能に移動し、完了したら postEvent に移動します。
    • render(); の後に QCoreApplication::processEvents() を呼び出します。MainThread で機能します。これは、システムがイベント ループ内にある他のすべてのイベントを処理してから続行するのに役立ちます。

次のリンクを確認してください。GUIの応答を改善する方法

注: タイマーを作成してトリガーすると、デフォルトでスレッド内で実行され、別のスレッドは開始されません。

于 2013-09-04T01:18:52.360 に答える
0

これが Qt のバグである可能性について Kuba Ober から聞いていないので、先に進んでバグレポートを提出しました: https://bugreports.qt-project.org/browse/QTBUG-33382

関数をより直接的に呼び出すことで、問題を部分的に回避することができましたrender()。つまり、イベントを送信してイベントを受信し、イベント ハンドラーに関数を呼び出させる代わりにです。私はディスパッチ キューでこれを達成しました (ただし、メインのディスパッチ キューではなく、デフォルトの実行ループに関連付けられているため、同じ問題があります)。ただし、複数のスレッドで QGLWidget を操作するのは困難でした。この機能を使用してこの機能を使用することをしばらく試みた後moveToThread()、プロジェクトに関係する他の要因を考慮して、Qt 以外のものを使用してこのウィンドウを表示することにしました。

于 2013-09-07T17:50:06.570 に答える