0

我有一个小 GIF,它在 a上QLabel带有. 我试过这个,但它不起作用:QMovieQlabel

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*)));

有(至少)三种方法可以解决这个问题。首先QLabel*从插槽中删除参数。然后:

  • 使用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 回答