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();
執行截圖如下:
後面還有很多,再次不再截圖