• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            zhonghua

            C++博客 首頁 新隨筆 聯系 聚合 管理
              72 Posts :: 1 Stories :: 4 Comments :: 0 Trackbacks

            概述

            Qt動畫架構中的主要類如下圖所示:



            動畫框架由基類QAbstractAnimation和它的兩個兒子QVariantAnimationQAnimationGroup組成。QAbstractAnimation是所有動畫類的祖宗。它包含了所有動畫的基本屬性。比如開始,停止和暫停一個動畫的能力。它也可以接收時間改變通知。


            動畫框架又進一步提供了QProertyAnimation類。它繼承自QVariantAnimation并對某個Qt屬性(它須是Qt的”元數據對象系統”的一部分,見http://blog.csdn.net/nkmnkm/article/details/8225089)執行動畫。此類對屬性執行一個寬松曲線插值。所以當你想去動畫一個值時,你可以把它聲明為一個屬性,并且讓你的類成為一個QObject。這給予我們極大的自由度來動畫那些已存在的widget和其它QObject


            復雜的動畫可以通過建立一個QAbstractAnimation的樹來構建。這個樹通過使用QAnimationGroups來創建,QAnimationGroups作為其它動畫的容器。注意動畫組也是從QAbstractAnimation派生的,所以動畫組可以再包含其它動畫組。


            動畫框架可以單獨使用,同時也被設計為狀態機框架的一部分。狀態機提供了一個特定的狀態可以用來播放動畫。在進入或退出某個狀態時QState也可以設置屬性們,并且這個特定的動畫狀態將在指定QPropertyAnimation時給予的值之間做插值運算。后面我們要進一步介紹此問題。


            在場景的背后,動畫被一個全局定時器收集,這個定時器發送update到所有的正在播放的動畫中。

            動畫框架中的類們

            QAbstractAnimation

            所有動畫類的基類

            QAnimationGroup

            動畫組的基類

            QEasingCurve

            控制動畫的寬松曲線類

            QParallelAnimationGroup

            并行動畫組類

            QPauseAnimation

            串行動畫組類的暫停類

            QPropertyAnimation

            動畫Qt屬性的類

            QSequentialAnimationGroup

            串行動畫組類

            QTimeLine

            控制動畫的時間線類

            QVariantAnimation

            各動畫類的虛基類


            動畫Qt屬性們

            如前面所講,QPropertyAnimation類可以修改Qt屬性們。要動畫一個值,就需要使用此類。實際上,它的父類,QVariantAnimation,是一個虛擬類,不能被直接使用。


            我們選擇動畫Qt屬性的一個主要理由是Qt屬性為我們提供了自己動畫已存在的類的自由度。尤其是QWidget類(我們也可以把它嵌入到一個QGraphicsView中)具有很多屬性表示其bounds,colors等等。讓我們看一個小例子:

            1. QPushButton button("Animated Button");  
            2. button.show();  
            3. QPropertyAnimation animation(&button, "geometry");  
            4. animation.setDuration(10000);  
            5. animation.setStartValue(QRect(0, 0, 100, 30));  
            6. animation.setEndValue(QRect(250, 250, 100, 30));  
            7. animation.start();  

            這段代碼將把按鈕在10秒種內從屏幕的左上角移動到(250,250)處。

            上面的例子舉在開始值和結束值之間做線性插值。還可以在開始和結束值之間設置值,插值運算就會經過這些點。


            1. QPushButton button("Animated Button");  
            2. button.show();  
            3. QPropertyAnimation animation(&button, "geometry");  
            4. animation.setDuration(10000);  
            5. animation.setKeyValueAt(0, QRect(0, 0, 100, 30));  
            6. animation.setKeyValueAt(0.8, QRect(250, 250, 100, 30));  
            7. animation.setKeyValueAt(1, QRect(0, 0, 100, 30));  
            8. animation.start();  

            在此例中,動畫將按鈕在8秒中內弄到(250,250)處,然后在2秒種內又弄回原位。移位是在這些點中間以線性插值進行的。


            你 也有可能動畫一個QObject的值,雖然這些值并沒有被聲明為Qt屬性。唯一的要求就是這個值具有一個setter。之后你可以從這個類派生子類從而包 含這些值并且聲明一個使用這個setter的屬性。注意每個Qt屬性都需要有一個getter,所以你需要提供一個getter,如果它不存在的話。

            1. class MyGraphicsRectItem : public QObject, public QGraphicsRectItem  
            2. {  
            3.     Q_OBJECT  
            4.     Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometry)  
            5. };  

            在上例中,我們派生了QGraphicsRectItem并定義了一個geometry屬性。我們現在可以動畫這個widget的geometry了,即使QGraphicsRectItem沒有提供geometry屬性。

            動畫和圖形視圖框架

            當你想動畫QGraphicsItems,你也要用QPropertyAnimation。然而,QGraphicsItem不是從QObject派生的。一個好的解決方案是派生要動畫的圖形item。派生類也要從QObject派生。這樣,QPropertyAnimation就可以被用于QGraphicsItems了。

            1. class Pixmap : public QObject, public QGraphicsPixmapItem  
            2. {  
            3.     Q_OBJECT  
            4.     Q_PROPERTY(QPointF pos READ pos WRITE setPos)  
            5.     ...  

            就如上一節中所講的,我們需要定義希望去動畫的屬性。

            注意:QObject必須是繼承中的第一個,因為元數據對象系統需要這樣做。

            寬松曲線

            QPropertyAnimation在屬性的開始值和結束值之間執行一個插值運算。除了向動畫添加更多的關鍵值外,你還可以使用一個寬松曲線。寬松曲線描述了一個在01之間插值的速度變化的函數,如果你想控制一個動畫的速度而不改變插值的路徑時,就非常有用。


            1. QPushButton button("Animated Button");  
            2. button.show();  
            3. QPropertyAnimation animation(&button, "geometry");  
            4. animation.setDuration(3000);  
            5. animation.setStartValue(QRect(0, 0, 100, 30));  
            6. animation.setEndValue(QRect(250, 250, 100, 30));  
            7. animation.setEasingCurve(QEasingCurve::OutBounce);  
            8. animation.start();  

            這里,動畫將按照一個曲線進行,這個曲線使得動畫像一個跳動的皮球從開始位置跳到結束位置。QEasingCurve具有一個大曲線集合,你可以從里面選擇一個。它們被定義為QEasingCurve::Type枚舉。如果你需要不一樣的曲線,你也可以自己實現一個,然后注冊到QEasingCurve。

            posted on 2013-06-05 16:39 米米 閱讀(827) 評論(0)  編輯 收藏 引用 所屬分類: qt
            国产精品成人精品久久久| 亚洲欧美久久久久9999 | 久久伊人影视| 一本伊大人香蕉久久网手机| 精品国产乱码久久久久久郑州公司 | 欧美日韩中文字幕久久伊人| 久久99热只有频精品8| 精品国产乱码久久久久久郑州公司| 少妇熟女久久综合网色欲| 亚洲性久久久影院| 久久久高清免费视频| 国色天香久久久久久久小说| 久久人人爽人人爽人人片AV高清 | 亚洲国产精品高清久久久| 一本久道久久综合狠狠爱| 久久亚洲私人国产精品vA| 亚洲va久久久噜噜噜久久| 伊人久久无码中文字幕| 欧美熟妇另类久久久久久不卡 | 亚洲Av无码国产情品久久| 日韩欧美亚洲综合久久影院Ds| 亚洲国产精品成人久久蜜臀 | 久久综合狠狠综合久久激情 | 99久久夜色精品国产网站| 亚洲精品国产综合久久一线| 亚洲国产成人久久精品99 | 狠狠色丁香久久婷婷综合_中| 波多野结衣AV无码久久一区| 无码伊人66久久大杳蕉网站谷歌| 久久精品国产91久久麻豆自制| 精品无码久久久久久国产| 亚洲性久久久影院| 久久精品无码一区二区三区| 久久久久亚洲av毛片大| 亚洲乱码中文字幕久久孕妇黑人| 7777久久亚洲中文字幕| 日韩久久无码免费毛片软件| 久久偷看各类wc女厕嘘嘘| 国内精品久久久久久麻豆| 亚洲精品乱码久久久久久按摩| 久久av免费天堂小草播放|