0

一連のコードを投稿せずにこの問題を説明できるかどうかはわかりませんが、ここに行きます。

一連の画像を表示するQtアプリがあります。各画像は、QLabel を使用して Qt のメイン ウィンドウに表示されます。各画像を表示するために、整数 i がフレーム番号である DisplayImg(int i) というサブルーチンを作成しました。単一の画像を表示するために機能します。

次に、一連の画像を再生する「再生」ボタンを (Qt で) 作成しました。再生ボタンは、on_Play_clicked() という名前のスロットに接続されています。それはこれを行うサブルーチンです:

for (i = 0 ; i < N ; i++) 
    DisplayImg(i);

問題は、表示がシーケンスの最後の画像に対してのみ変化することです。DisplayImg() がすべての中間画像に対して呼び出されることを (printf() から) 知っていても、中間画像は表示されません。

それは問題を説明するのに十分な情報ですか? スロットの仕組みを誤解していますか? サブルーチン on_Play_clicked() が戻るまで、メインの Qt ウィンドウは更新されませんか?

4

3 に答える 3

3

はい。Qt は、制御フローがイベント ループに戻ったときにのみ描画を実行します。を作成し、その信号をスロットQTimerに接続し、ミリ秒単位で目的の間隔でタイマーを開始する必要があります。timeoutスロットには、次の画像を表示する必要がありますDisplayImg(i); i++;。現在の画像番号 (i) は、クラス メンバー変数に格納する必要があります。最後の画像が表示されたら、タイマーを停止します。

于 2013-08-09T17:28:14.593 に答える
0

完全を期すためだけに。多くの場合、この QCoreApplication::processEvents() のような問題は解決策です。したがって、コードは次のようになります。

for (i = 0 ; i < N ; i++) {
    QCoreApplication::processEvents();
    DisplayImg(i);
}

しかし... この特定のケースでは、timer ソリューションは processEvent ソリューションよりも明らかに優れています。ディスプレイをより細かく制御できます。

于 2013-08-10T23:14:54.847 に答える
0

Qt のメイン ウィンドウで画像が変化しているように見えないのは、各画像を変更する間に遅延がないためです。コードを次のように変更すると、目的の効果が得られるはずです。

for (i = 0 ; i < N ; i++)   
    QTimer::singleShot(5000 * i, this, SLOT(DisplayImg(i))); // sleep 5 seconds and then call display image


次のように、 DisplayImage メソッドをクラスのスロットとして宣言する必要があります。

#include <QtCore>

class YourClass : public QObject
{
    Q_OBJECT
private slots:
    void DisplayImage(int i);

// private members
// public members

};
于 2013-08-09T17:28:49.637 に答える