PDA

View Full Version : QGraphicsOpacityEffect animation on QPushButton not working in some cases



kalos80
3rd September 2012, 13:11
Hi,

I have a button whose opacity changes when the mouse moves on top of the it.
I’m using a QGraphicsOpacityEffect to change the button opacity and I’m animating the opacity using a QPropertyAnimation.

The animation works greatly unless I add a QGLWidget in the same window where the button is.

I wrote a very simple application for debugging. It is a dialog with a QGLWidget and two opacity animated buttons, one inside the QGLWidget and one outside it.
If the QGlWidget is not created then the button animation is working very well. When I create the QGLWidget and add it to the dialog the button animation stops working.
The QGLWidget does nothing, it just draws a black background.

Here is the code:


static const qreal START_OPACITY = 0.3;


// PushButtonAnimated code
PushButtonAnimated::PushButtonAnimated(QWidget * parent)
: QPushButton(parent)
{
QGraphicsOpacityEffect *effect = new QGraphicsOpacityEffect(this);
effect->setOpacity(START_OPACITY);
setGraphicsEffect(effect);

animation = new QPropertyAnimation(effect, "opacity");
animation->setDuration(500);
animation->setStartValue(START_OPACITY);
animation->setEndValue(1.0);
}

void PushButtonAnimated::enterEvent(QEvent *e)
{
if( animation->state() == QAbstractAnimation::Running )
animation->pause();
animation->setDirection(QAbstractAnimation::Forward);

animation->start();
}

void PushButtonAnimated::leaveEvent(QEvent *e)
{
if( animation->state() == QAbstractAnimation::Running )
animation->pause();
animation->setDirection(QAbstractAnimation::Backward);

animation->start();
}


// QGLWidget, has an animated button
// just draws a black background
MyGLWidget::MyGLWidget(QWidget *parent)
: QGLWidget(parent)
{
PushButtonAnimated *pb = new PushButtonAnimated(this);
pb->setIcon( QIcon("icon.png") );
}

void MyGLWidget::initializeGL()
{
// Set up the rendering context, define display lists etc.:
qglClearColor( Qt::black );
// Setting the Hidden Surface Removal process
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
}

void MyGLWidget::resizeGL(int w, int h)
{
// setup viewport, projection etc.:
glViewport(0, 0, (GLint)w, (GLint)h);
}

void MyGLWidget::paintGL()
{
// draw the scene:
// ...
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}


// this is the main
int main( int argc, char *argv[] )
{
QApplication appMain(argc, argv);

// build interface
QDialog *dg = new QDialog();

PushButtonAnimated *pb = new PushButtonAnimated(dg);
pb->setIcon( QIcon(":/test/icon.png") );
QSpacerItem *spacer = new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Minimum);


QGridLayout *layout = new QGridLayout(dg);
layout->addItem(spacer, 1, 0);
layout->addWidget(pb, 1, 1);

bool showOgl = false;
// bool showOgl = true;
if( showOgl )
{
// IF THIS CODE IS ENABLED THEN
// THE BUTTON ANIMATION IS NO MORE WORKING
MyGLWidget *glWidget = new MyGLWidget(dg);
QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
glWidget->setSizePolicy(sizePolicy);
layout->addWidget(glWidget, 0, 0);
}

dg->show();
dg->resize(500, 500);

return appMain.exec()
}

Do you have any hint on how to have both buttons animation working?

Thanks in advance for your help

P.S.
attached is the full example code