QPushButton
может иметь значок, но мне нужно установить для него анимированный значок. Как это сделать? Я создал новый класс, реализованный из QPushButton
, но как заменить значок с QIcon
на QMovie
?
Как установить анимированный значок на QPushButton в Qt5?
Ответы (2)
Поскольку сегодня мне нужно было решить эту проблему для моего проекта, я просто хотел отбросить найденное решение для будущих людей, потому что у этого вопроса много просмотров, и я посчитал решение довольно элегантным. Решение опубликовано здесь. Он устанавливает значок кнопки каждый раз, когда изменяется кадр QMovie:
auto movie = new QMovie(this);
movie->setFileName(":/sample.gif");
connect(movie, &QMovie::frameChanged, [=]{
pushButton->setIcon(movie->currentPixmap());
});
movie->start();
Это также имеет то преимущество, что значок не появится до тех пор, пока не будет запущен QMovie. Вот также решение Python, которое я получил для своего проекта:
#'hide' the icon on the pushButton
pushButton.setIcon(QIcon())
animated_spinner = QtGui.QMovie(":/icons/images/loader.gif")
animated_spinner.frameChanged.connect(updateSpinnerAniamation)
def updateSpinnerAniamation(self):
#'hide' the text of the button
pushButton.setText("")
pushButton.setIcon(QtGui.QIcon(animated_spinner.currentPixmap()))
Как только вы захотите показать счетчик, просто запустите QMovie:
animated_spinner.start()
Если счетчик должен снова исчезнуть, остановите анимацию и снова «скройте» счетчик. Как только анимация остановлена, слот frameChanged больше не будет обновлять кнопку.
animated_spinner.stop()
pushButton.setIcon(QtGui.QIcon())
Этого можно добиться без создания подкласса QPushButton
, просто используя механизм сигналов/слотов Qt. Подключите сигнал frameChanged
QMovie
к пользовательскому слоту в классе, который содержит этот QPushButton
. Эта функция применит текущий кадр QMovie
в качестве значка QPushButton
. Это должно выглядеть примерно так:
// member function that catches the frameChanged signal of the QMovie
void MyWidget::setButtonIcon(int frame)
{
myPushButton->setIcon(QIcon(myMovie->currentPixmap()));
}
И при распределении ваших QMovie
и QPushButton
участников...
myPushButton = new QPushButton();
myMovie = new QMovie("someAnimation.gif");
connect(myMovie,SIGNAL(frameChanged(int)),this,SLOT(setButtonIcon(int)));
// if movie doesn't loop forever, force it to.
if (myMovie->loopCount() != -1)
connect(myMovie,SIGNAL(finished()),myMovie,SLOT(start()));
myMovie->start();
setMovie
. Я думаю, что это было бы более элегантно и совместимо с ООП.
- person Pavel Strakhov; 12.06.2013