繁体   English   中英

通过QLabel作为参数Qt C ++

[英]Passing QLabel as parameter Qt C++

我有一个GIF动画,它在QLabel带有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();
}

基本的误解,这是非法的:

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

您不能将这样的参数提供给连接。 只需输入SLOT ,如下所示:

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

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

  • 使用QSignalMapper ,它基本上封装了下面的两个选择。
  • 在某个类中创建一个具有QLabel *成员变量的中间插槽,然后将其用于不带参数的插槽中,并将计时器信号连接到该插槽。
  • 在您的插槽中使用sender()方法(但这通常被认为很丑陋,破坏了封装,并且QSignalMapper是首选)。

这里实际上并不需要使用QTimer来同步电影的结尾。

实现此目的的最简单方法是让电影在完成后删除标签:

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

finished() ,QMovie将发出finish finished() 因此,只需将其连接到QLabel的deleteLater()插槽即可。

由于这可能会使您在删除QLabel时泄漏QMovie,因此您可能希望将其作为QLabel的父项,因为将其设置为电影并不意味着QLabel实际上会对其进行清理。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM