0

QLabelでアニメーション化された小さな GIF がありQMovie、GIF のアニメーションが完了したら、Qlabel. 私はこれを試しましたが、うまくいきません:

QMovie *movie = new QMovie("countdown.gif");
QLabel *processLabel = new QLabel(this);
processLabel->setMovie(movie);
movie->start();

QTimer::singleShot(1000, this, SLOT(movie_finished(backgroundLabel)));

ここに私の機能があります:

void movie_finished(QLabel *processLabel){
    processLabel->deleteLater();
}
4

2 に答える 2

2

基本的な誤解、これは違法です:

QTimer::singleShot(1000, this, SLOT(movie_finished(backgroundLabel)));

そのようなパラメーターを接続に与えることはできません。SLOT次のように入力するだけです。

QTimer::singleShot(1000, this, SLOT(movie_finished(QLabel*)));

これを解決するには、(少なくとも) 3 つの方法があります。最初にQLabel*スロットからパラメーターを削除します。それで:

  • 基本的に以下の 2 つの選択肢をカプセル化するQSignalMapperを使用します。
  • QLabel* メンバー変数を持ついくつかのクラスに中間スロットを作成し、パラメーターなしでスロットで使用し、タイマー信号をこのスロットに接続します。
  • スロットでメソッドを使用sender()します (ただし、これは一般に見苦しく、カプセル化を壊すと考えられており、QSignalMapper が推奨されます)。
于 2012-11-25T21:05:48.620 に答える
1

QTimerを使用してムービーの終わりを同期することは、ここでは実際には必要ありません。

これを実現するための本当に簡単な方法は、ムービーが終了したときにラベルを削除することです。

connect(movie, SIGNAL(finished()), processLabel, SLOT(deleteLater()));

QMovieは、完了すると放出さfinished()れます。したがってdeleteLater()、QLabelのスロットに配線するだけです。

これにより、QLabelが削除されたときにQMovieがリークする可能性があるため、QLabelをペアレント化することをお勧めします。これは、ムービーとして設定しても、QLabelが実際にクリーンアップすることを意味しないためです。

QLabel *processLabel = new QLabel(this);
QMovie *movie = new QMovie("countdown.gif");
movie->setParent(processLabel);
于 2012-11-29T19:15:20.497 に答える