2013-03-12 9 views

Odpowiedz

21

Można tego dokonać bez podklasy QPushButton, po prostu używając mechanizmu sygnału/szczeliny Qt. Połącz sygnał frameChanged z QMovie z niestandardowym gniazdem w klasie, który zawiera ten QPushButton. Ta funkcja zastosuje bieżącą ramkę QMovie jako ikonę QPushButton. Powinno to wyglądać mniej więcej tak:

// member function that catches the frameChanged signal of the QMovie 
void MyWidget::setButtonIcon(int frame) 
{ 
    myPushButton->setIcon(QIcon(myMovie->currentPixmap())); 
} 

A przy przydzielaniu swoich członków QMovie i 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(); 
+0

Dziękuję bardzo. Czy obraz animacji może mieć przezroczyste tło? – Robotex

+0

Powinieneś być w stanie, o ile wiem. Format GIF pozwala na przezroczystość (poprzez określenie koloru na obrazku, który powinien być przezroczysty), a Qt pozwala na rysowanie przezroczystych map QPix przez widżety. Jedyne, czego nie jestem pewien, to to, czy QMovie obsługuje przezroczystość. Ponieważ klasy Qt są zwykle bardzo dokładne, zaskoczyłoby mnie, gdyby QMovie nie wspierało przejrzystości, ale nie wspomina o tym w dokumentacji. –

+0

Potrzebuję dwóch animowanych ikon i zmieniam je w zależności od sytuacji (gdy idle - jeden, podczas pracy - inny). Jak mogę to zrobić elegancko? – Robotex

Powiązane problemy