Передача QLabel в качестве параметра Qt Stack Overflow

У меня есть маленький 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();
}

0

Решение

Использование 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);
1

Другие решения

Основное недоразумение, это незаконно:

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

Вы не можете давать такие параметры для соединений. Просто набирает SLOT, как это:

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

Есть (по крайней мере) три способа решить эту проблему. Сначала удалите QLabel* параметр из слота. Затем:

  • использование QSignalMapper, который в основном заключает в себе две альтернативы ниже.
  • Создайте промежуточный слот в некотором классе, который имеет переменную-член QLabel *, которую он затем использует в слоте без параметра, и подключите сигнал таймера к этому слоту.
  • использование sender() метод в вашем слоте (но это обычно считается уродливым, нарушая инкапсуляцию, и QSignalMapper предпочтительнее).
2

По вопросам рекламы [email protected]