1. 程式人生 > >Qt文件閱讀筆記-QPropertyAnimation官方解析及例項

Qt文件閱讀筆記-QPropertyAnimation官方解析及例項

目錄

官方解析

博主例子

官方解析

QPropertyAnimation

QPropertyAnimation類為Qt屬性提供動畫。 QPropertyAnimation類可以修改Qt屬性,從而達到動畫的效果。這些屬性的值儲存在QVariants中,所以QPropertyAnimation繼承了QvariantAnimation,並且支援他相同元型別的動畫,比如他的超類。 這個類必須是QObject的派生類。他必須經過一個設定才能使動畫效果成為可能(這樣的化QPropertyAnimation能夠設定屬性的值)。注意到這使得Qt小部件(視窗)都能做出動畫的形式。舉個例子:

  QPropertyAnimation *animation = new QPropertyAnimation(myWidget, "geometry");
  animation->setDuration(10000);
  animation->setStartValue(QRect(0, 0, 100, 30));
  animation->setEndValue(QRect(250, 250, 100, 30));

  animation->start();

屬性名和QObject的例項這屬性應該被傳遞給動畫的建構函式。然後你能指定這個屬性的開始和結束的指。當你自定義屬性的時候實現的效果也是一樣的,只要QVariant能支援,QVariantAnimation就能用。 QVariantAnimation類描述瞭如何去做一個動畫的細節。注意,如果start value沒有被設定,這個屬性會設定一個值,這個值是QPropertyAnimation例項化的時候建立的。 QpropertyAnimation工作的時候是充滿魅力的,要想完成一個複雜的動畫,要包含幾個物件例項,這裡把他們放到QAnimationGroup中。一個動畫組也是一個動畫,這個動畫包含了許許多多的動畫。當組內的動畫執行時他能夠管理內部的小動畫,檢視QParallelAnimationGroup這個例子可以看他如何使用以及管理。  

博主例子

我們把官方例項完整的實現出來。可以發現QpropertyAnimation和QTimeLine效果有點像,不過還是有區別的,關於QTimeLine可以看本人的這篇博文:https://mp.csdn.net/postedit/81530848

執行截圖如下:

原始碼如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

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

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"

#include <QPropertyAnimation>
#include <QMetaProperty>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QPropertyAnimation *animation=new QPropertyAnimation(ui->pushButton,"minimumSize");
    animation->setDuration(10000);
    animation->setStartValue(QSize(0,0));
    animation->setEndValue(QSize(300,300));
    animation->start();
}

Widget::~Widget()
{
    delete ui;
}

關於QPushButton的屬性可以用下面這種方式獲得:

虛擬碼如下:

    for(int i=0;i<ui->pushButton->metaObject()->propertyCount();i++)
        qDebug()<<ui->pushButton->metaObject()->property(i).name();

執行截圖如下:

後面還有很多,再次不再截圖