У меня есть маленький 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 для синхронизации конца фильма здесь на самом деле не нужно.
Действительно простой способ сделать это — просто удалить фильм, когда он будет закончен:
connect(movie, SIGNAL(finished()), processLabel, SLOT(deleteLater()));
QMovie будет излучать finished()
когда это будет сделано. Так что просто подключите его к deleteLater()
слот вашего QLabel.
Поскольку это может привести к утечке QMovie при удалении QLabel, вы можете добавить его в QLabel, так как установка его в качестве фильма не означает, что QLabel на самом деле его очищает.
QLabel *processLabel = new QLabel(this);
QMovie *movie = new QMovie("countdown.gif");
movie->setParent(processLabel);
Основное недоразумение, это незаконно:
QTimer::singleShot(1000, this, SLOT(movie_finished(backgroundLabel)));
Вы не можете давать такие параметры для соединений. Просто набирает SLOT
, как это:
QTimer::singleShot(1000, this, SLOT(movie_finished(QLabel*)));
Есть (по крайней мере) три способа решить эту проблему. Сначала удалите QLabel*
параметр из слота. Затем:
sender()
метод в вашем слоте (но это обычно считается уродливым, нарушая инкапсуляцию, и QSignalMapper предпочтительнее).