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
){
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();
}
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();
}
To copy to clipboard, switch view to plain text mode
// QGLWidget, has an animated button
// just draws a black background
MyGLWidget
::MyGLWidget(QWidget *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);
}
// 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);
}
To copy to clipboard, switch view to plain text mode
// this is the main
int main( int argc, char *argv[] )
{
// build interface
PushButtonAnimated *pb = new PushButtonAnimated(dg);
pb
->setIcon
( QIcon(":/test/icon.png") );
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);
glWidget->setSizePolicy(sizePolicy);
layout->addWidget(glWidget, 0, 0);
}
dg->show();
dg->resize(500, 500);
return appMain.exec()
}
// 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()
}
To copy to clipboard, switch view to plain text mode
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
Bookmarks