1
votes

I would like to animate the size of the QPushButton icon, because when i try to animate whole QPushButton object size, icon is not resizing at all. It seems theres no property "setScaledContents" on QPushButton icon. I tried to use this code for icon in my custom QPushButton method (on hover):

QIcon *icon = new QIcon(this->icon());
QPropertyAnimation *animation = new QPropertyAnimation((QObject*)icon, "size");
animation->setDuration(1000);
QSize test = this->size();
animation->setStartValue(test);

animation->setEndValue(QSize(test.width()+100,test.height()+100));

animation->start();

But i receive an error "segmentation failed" on this code. Is there any other way i can animate my QPushButton icon?

1
QIcon doesn't inherit from QObject, so this type cast: (QObject*)icon is dangerous and wrong.Chris
QPushButton has iconSize property. Why not animate it instead of animating QIcon?Kamil Klimek
I tried QPropertyAnimation *animation = new QPropertyAnimation(this, "iconSize"); animation->setDuration(500); // QSize test = this->size(); animation->setStartValue(QSize(1024,1024)); animation->setEndValue(QSize(512,512)); animation->start(); but it doesn't workSirLanceloaaat
Changing to "iconSize" worked for me just fine... I did not bother subclassing QPushButton and I made sure to assign an icon to QPushButton (arbitrary PNG). Try it out with just "size" firstHuy

1 Answers

2
votes

What you need to do is instead pass in a valid reference to a QObject (per Chris' comment above)

Your code works fine if I simply replace the parameter passed into QPropertyAnimation:

// ui->pushButton is a QPushButton*
QPropertyAnimation *animation = new QPropertyAnimation(ui->pushButton, "size");
animation->setDuration(1000);
QSize test = this->size();
animation->setStartValue(test);
animation->setEndValue(QSize(test.width()+100,test.height()+100));
animation->start();

I'm going to assume that you're subclass-ing QPushButton (explains this->icon())... perhaps you can try to access it directly instead? Though I'm going to guess that it's privately owned by the base/parent class.