在Qt中显示自定义窗口小部件时的过渡效果

时间:2013-01-21 15:36:00

标签: qt qt4 widget effects transitions

我想逐步显示一个自定义小部件,比如以0不透明度开始并在给定时间内变为100。是否有可能以一种简单的Qt方式为此目的而开发?或者我可以自己做吗?

干杯,

3 个答案:

答案 0 :(得分:7)

QGraphicsOpacityEffectQPropertyAnimation一起使用会更简单,这完全是针对这样的事情而制作的。您需要做的就是将QGraphicsOpacityEffect附加到QWidget后代,然后将其设置为新创建的QPropertyAnimation的目标,并使用您想要的选项运行QPropertyAnimation

答案 1 :(得分:3)

您可以尝试使用计时器,该计时器将逐步调整显示事件的窗口小部件的不透明度。拿这个例子(急着写):

class MyWidget: public QWidget{
public:
    MyWidget(QWidget* parent) : QWidget(parent){
       //setup the timer first
       timer.setInterval(xxx);
       connect(&timer, SIGNAL(timeOut()),this, SLOT(increaseOpacity()));
    };

protected:
    virtual void MyWidget::showEvent ( QShowEvent * event ){
        opacity = 0;
        setOpacity(opacity);
        QWidget::showEvent(event);
        timer.start();
    }

    virtual void MyWidget::hideEvent ( QHideEvent * event ){
        QWidget::hideEvent(event);
        timer.stop();
    }

private slot:
    void increaseOpacity(){
        if(opacity>=1.0){
           timer.stop();
        }
        opacity += 0.1;
        setOpacity(opacity);
    }
private:
   Qtimer timer;
   double opacity; 

}

答案 2 :(得分:1)

如果您的QWidget是窗口,您可以使用:

#include <QApplication>
#include <QWidget>
#include <QPropertyAnimation>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    w.show();

    QPropertyAnimation animation(&w, "windowOpacity");
    animation.setDuration(10000);
    animation.setStartValue(1.0);
    animation.setEndValue(0.0);

    animation.start();

    return a.exec();
}

否则:

#include <QApplication>
#include <QWidget>
#include <QPropertyAnimation>
#include <QGraphicsOpacityEffect>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWidget w;
    QPushButton b(&w);
    w.show();

    QGraphicsOpacityEffect effect;
    b.setGraphicsEffect(&effect);

    QPropertyAnimation animation(&effect, "opacity");
    animation.setDuration(1000);
    animation.setStartValue(1.0);
    animation.setEndValue(0.0);

    animation.start();

    return a.exec();
}

最简单的方法是使用QML来实现此目标:

import QtQuick 2.0

Rectangle {
    width: 360
    height: 360

    Rectangle {
        width: 100
        height: 100
        color: "red"

        NumberAnimation on opacity {
            from: 1.0; to: 0.0
            duration: 5000
        }
    }
}