• <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

            2015年2月2日 #

            在最近的web開發中是不是就會用到一些選擇器,發現很多尤其是CSS3新增的不太熟悉,在此總結一下。

            優先級

            不同級別

            1. 在屬性后面使用 !important 會覆蓋頁面內任何位置定義的元素樣式。

            2.作為style屬性寫在元素內的樣式

            3.id選擇器

            4.類選擇器

            5.標簽選擇器

            6.通配符選擇器

            7.瀏覽器自定義

            同一級別

            同一級別中后寫的會覆蓋先寫的樣式

             

            基礎選擇器

            選擇器含義
            *通用元素選擇器,匹配頁面任何元素(這也就決定了我們很少使用)
            #idid選擇器,匹配特定id的元素
            .class類選擇器,匹配class包含(不是等于)特定類的元素
            element標簽選擇器

             

            復制代碼
            *         {             /*頁面所有元素都使用*/             border:0;         }          #test         {             /*id=test 的元素*/             background-color:#0e0;         }          .staus         {             /*含有類status的元素*/             border:0;         }          div         {             /*頁面所有div*/              background-color:#0e0;         }
            復制代碼

            組合選擇器

            選擇器含義
            E,F多元素選擇器,用”,分隔,同時匹配元素E或元素F
            E F后代選擇器,用空格分隔,匹配E元素所有的后代(不只是子元素、子元素向下遞歸)元素F
            E>F子元素選擇器,用”>”分隔,匹配E元素的所有直接子元素
            E+F直接相鄰選擇器,匹配E元素之后相鄰同級元素F
            E~F普通相鄰選擇器(弟弟選擇器),匹配E元素之后同級元素F(無論直接相鄰與否)
            .class1.class2這個姑且也算一個吧,沒什么名字,匹配類名中既包含class1又包含class2的元素

            我就不一一舉例子了,選擇器并不是只能寫兩層,發現有些小朋友有這種誤解,認為只能寫E>F這樣的,我們寫可以寫E>F.class Element這樣,你要你搞得定優先級

             

            屬性選擇器

             

            選擇器含義
            E[attr]匹配所有具有屬性attr的元素,div[id]就能取到所有有id屬性的div
            E[attr=value]匹配屬性attr值為value的元素,div[id=test],匹配id=test的div
            E[attr~=value]匹配所有屬性attr具有多個空格分隔、其中一個值等于value的元素
            E[attr|=value]匹配所有att屬性具有多個”-”分隔、其中一個值以value開頭的元素,主要用于lang屬性,比如“en”、“en-us”
            E[attr ^=value]匹配屬性attr的值以value開頭的元素
            E[attr $=value]匹配屬性attr的值以value結尾的元素
            E[attr *=value]匹配屬性attr的值包含value的元素

            偽類選擇器

             

            選擇器含義
            E:first-child匹配元素E的第一個子元素
            E:link匹配所有未被點擊的鏈接
            E:visited匹配所有已被點擊的鏈接
            E:active匹配鼠標已經其上按下、還沒有釋放的E元素
            E:hover匹配鼠標懸停其上的E元素
            E:focus匹配獲得當前焦點的E元素
            E:lang(c)匹配lang屬性等于c的E元素
            E:enabled匹配表單中可用的元素
            E:disabled匹配表單中禁用的元素
            E:checked匹配表單中被選中的radio或checkbox元素
            E::selection匹配用戶當前選中的元素
            E:root匹配文檔的根元素,對于HTML文檔,就是HTML元素
            E:nth-child(n)匹配其父元素的第n個子元素,第一個編號為1
            E:nth-last-child(n)匹配其父元素的倒數第n個子元素,第一個編號為1
            E:nth-of-type(n)與:nth-child()作用類似,但是僅匹配使用同種標簽的元素
            E:nth-last-of-type(n)與:nth-last-child() 作用類似,但是僅匹配使用同種標簽的元素
            E:last-child匹配父元素的最后一個子元素,等同于:nth-last-child(1)
            E:first-of-type匹配父元素下使用同種標簽的第一個子元素,等同于:nth-of-type(1)
            E:last-of-type匹配父元素下使用同種標簽的最后一個子元素,等同于:nth-last-of-type(1)
            E:only-child匹配父元素下僅有的一個子元素,等同于:first-child:last-child或 :nth-child(1):nth-last-child(1)
            E:only-of-type匹配父元素下使用同種標簽的唯一一個子元素,等同于:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1)
            E:empty匹配一個不包含任何子元素的元素,文本節點也被看作子元素
            E:not(selector)匹配不符合當前選擇器的任何元素

            偽元素選擇器

             

            選擇器含義
            E:first-line匹配E元素內容的第一行
            E:first-letter匹配E元素內容的第一個字母
            E:before在E元素之前插入生成的內容
            E:after在E元素之后插入生成的內容
            posted @ 2015-02-02 15:01 米米 閱讀(236) | 評論 (0)編輯 收藏

            2014年1月13日 #

                 摘要:       最近寫程序中需要將數據輸出保存到Excel文件中。翻看《C++ GUI Programming with Qt 4》(Second Edition)發現可以在Qt中運用ActiveX控件,這真是太好了。        看了很久教程也沒有學會,畢竟是新手,平時也沒學過ActiveX編程。一些在VB中可以方便使用的函數在...  閱讀全文
            posted @ 2014-01-13 17:23 米米 閱讀(2291) | 評論 (0)編輯 收藏

            2014年1月9日 #

            • 老有人問如何讓Qt的應用程序自動重啟,稍微寫一點,也順便理理自己的思路 2011.10.26

            自動重啟,也就是退出當前進程,啟動一個新的進程。于是,先看程序如何退出

            退出

            Qt程序的一般結構如下:

            int main(int argc, char** argv) {     QApplication app(argc, argv);     Widget w;     w.show()     return app.exec(); }

            最后一句啟動了主線程的事件循環。而要退出程序,就是要退出這個事件循環,使main函數返回。

            如何退出?

            正確方式:

            • QCoreApplication::exit(int);

            它還有一個馬甲

            • QCoreApplication::quit();

            對于QApplication來說,它有一個常用的屬性

            quitOnLastWindowClosed

            所以,當最后一個窗口關閉時,它可以自動調用前面的exit()

            而至于關閉窗口呢,我們還可以使用

            • QApplication::closeAllWindows()

            注:一般來說,對于多個窗口的程序,調用這個會比直接調用quit要好。因為這樣窗口可以接受到Close事件。

            啟動外部程序

            在Qt中,做這個工作的非QProcess莫屬了,要啟動當前程序的另一個進程,有要使二者沒有"父子"關系。恩

            QProcess::startDetached(qApp->applicationFilePath(), QStringList());

            可是,為什么不寫成下面這樣?

            QProcess::startDetached(qApp->applicationFilePath());

            當然,如果路徑中不包含空格,這個也可以工作。

            重新啟動1

            現在簡單了,要重新啟動,只需要調用

            void XXX::onXXX() {     qApp->quit();     QProcess::startDetached(qApp->applicationFilePath(), QStringList()); }

            或者:

            void XXX::onXXX() {     qApp->closeAllWindow();     QProcess::startDetached(qApp->applicationFilePath(), QStringList()); }

            重新啟動2

            盡管沒什么好處,但有時候,我似乎更喜歡這樣寫:

            void XXX::onXXX() {     qApp->exit(773) }

            然后main函數改成

            int main(int argc, char** argv) { ....     int ret = app.exec();     if (ret == 773) {         QProcess::startDetached(qApp->applicationFilePath(), QStringList());         return 0;     }     return ret; }

            這里面我用了一個魔數:773,沒什么特別含義,只是因為我覺得

            773 = 'r'+'e'+'s'+'t'+'a'+'r'+'t'  ==>restart

            上班了,就寫到這兒...

            posted @ 2014-01-09 15:13 米米 閱讀(890) | 評論 (0)編輯 收藏

            2013年12月11日 #

                 摘要:         昨晚在一個郵件列表里面看見一個關于在線程種使用signal/slot的討論,由于回復太多,這里就不貼出原文了。        主要是關于怎樣從一個線程發送信號到另外一個線程的問題。其實這個也不是什么復雜的問題,在qt的asstant里面已經描訴...  閱讀全文
            posted @ 2013-12-11 17:08 米米 閱讀(879) | 評論 (0)編輯 收藏

            2013年11月17日 #

             轉自:http://indure.chinaunix.com/space.php?uid=25520556&do=blog&id=2211406

                   主要使用QTableView和QTableWidget中的三個函數實現

            QTableView::verticalScrollBar()->setSliderPosition()  //設置當前滑動條的位置

            QTableView::verticalScrollBar()->maximum();             //滑動條能移動的最大位置

            QTableView::verticalScrollBar()->value();                   //獲得當前滑動條的位置

             

             

            1. static int nCurScroller=0; //翻頁時的當時滑動條位置
            2. static int pageValue = 10; // 一頁顯示條數

            3. void SplayHisForm::createHisForm()
            4. {
            5.                 …….
            6.     hisTableWidget = new QTableWidget;
            7.     hisTableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
            8.     hisTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
            9.             …….
            10. }

            11. /***下一頁***/
            12. void SplayHisForm::nextPageHis()
            13. {
            14.     int maxValue = hisTableWidget->verticalScrollBar()->maximum(); // 當前SCROLLER最大顯示值25
            15.     nCurScroller = hisTableWidget->verticalScrollBar()->value(); //獲得當前scroller值

            16.     if(nCurScroller<maxValue)
            17.         hisTableWidget->verticalScrollBar()->setSliderPosition(pageValue+nCurScroller);
            18.     else
            19.         hisTableWidget->verticalScrollBar()->setSliderPosition(0);
            20. }

            21. /***上一頁***/
            22. void SplayHisForm::prePageHis()
            23. {
            24.     int maxValue = hisTableWidget->verticalScrollBar()->maximum(); // 當前SCROLLER最大顯示值25
            25.     nCurScroller = hisTableWidget->verticalScrollBar()->value();

            26.     if(nCurScroller>0)
            27.         hisTableWidget->verticalScrollBar()->setSliderPosition(nCurScroller-pageValue);
            28.     else
            29.         hisTableWidget->verticalScrollBar()->setSliderPosition(maxValue);
            30. }

             QTableView和QTableWidget翻頁功能實現

            posted @ 2013-11-17 17:15 米米 閱讀(3158) | 評論 (0)編輯 收藏

            2013年9月12日 #

            vs生成的工程 用
            qmake -project 生成pro
            在pro里增加

            TRANSLATIONS += myapp.ts

            然后命令行輸入lupdate ***.pro
            打開.ts文件,一條一條的翻譯就是了
            最后lrelease ***.pro

            posted @ 2013-09-12 15:59 米米 閱讀(484) | 評論 (0)編輯 收藏

            2013年6月5日 #

            Qt4中的tooltip與win32中的tooltip有很多不一樣的地方,下面來總結一下。

            一是不能直在堆或棧中生成QToolTip對象。因為其構造函數為私有。
            二是從widget獲取的tooltip不是tooltip對象,而是tooltip中的文本。
            三是tooltip跟本不是一個widget。所以不把它當作widget用。
            四是tooltip類是一個靜態類,所以跟本不必生成tooltip對象就可以使用。
            五是tooltip類不能被定制,所以不能從它產生各種形狀的tooltip窗口。

            QtoolTip有兩種使用方式:
            一是靜態tooltip。比如為一個widget設置一個不變的tooltip文本,當鼠標移上去時顯示tooltip。此時很簡單,只需調用widget的setToolTip()設置文本即可。
            二是動態tooltip。也就是一個widget上的tooltip是變化的。此時需要重寫QWidget::event()函數,在里面判斷事件類型,如果是QEvent::ToolTip,則控制顯示的文本的內容,即可實現動態tooltip。

            看如下代碼示例:

            1. bool SortingBox::event(QEvent *event)  
            2.  {  
            3.      if (event->type() == QEvent::ToolTip) {  
            4.          QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);  
            5.          int index = itemAt(helpEvent->pos());  
            6.          if (index != -1) {  
            7.              QToolTip::showText(helpEvent->globalPos(), shapeItems[index].toolTip());  
            8.          } else {  
            9.              QToolTip::hideText();  
            10.              event->ignore();  
            11.          }  
            12.   
            13.          return true;  
            14.      }  
            15.      return QWidget::event(event);  
            16.  }  
            可以看到,是調用 QtoolTip::showText()在某個位置顯示tooltip文本。

            那么,如果想隨時顯示tooltip,該怎么做呢?其實十分簡單:直接調用QToolTip::showText(),指定要顯示的位置就行了。因為tooltip類的函數跟本就相當于全局函數而已。

            呵呵,其實很簡單,但從win32轉過來的人,覺得真別扭。
            posted @ 2013-06-05 16:41 米米 閱讀(1939) | 評論 (0)編輯 收藏

            QThread從QObject派生。它發出信號來表明線程開始了或結束了。并且也提供了幾個槽。

            更有趣的是,QObject可以在多個程中同時使用,可以發出信號給另外線程的槽,以及向“活在”另外線程中的對象郵寄事件。以上之所以能發生,是因為每個初程都被允許擁有它自己的事件循環。

            QObject 重入

            QObject 是可重入的。它大多數非界面派生類,比如QTimer,QTcpSocket,QFtp,和QProcess,也都是可重入的,使得在多個線程中同時使用 這些類成為可能。但是注意這些類被設計為在一個線程中創建和使用;在一個線程中創建一個對象然后在另一個線程中調用它的方法是不能保證一定能工作的。有三 個限制條件要注意:
            QObject的兒子必須在創建它爹的線程中創建。這表示,你永遠不能將QThread對象(this)作為parent傳給在此thread創建的對象,因為線程對象自己就是在另一個線程中創建的。
            事件驅動的對象應該只用于一個線程中。這一條尤其應用于定時器和網絡模塊。比如,你不能在創建對象之外的線程中啟動一個定時器或連接一個socket。
            你必須保證在線程中創建的一切對象在QThread被刪除之前被刪除。這可以通過在你的run()實現中在棧中創建對象來輕松搞定。

            盡管QObject是可重入的,但GUI類,尤其是QWidget和它所有的派生類們,都不是可重入的。它們只能在主線程中使用。QCoreApplication::exec()必須在這個線程中調用。

            在實際應用中,最好的方式是把耗時的計算放到主線程中外進行,完成后通知主線程顯示結果。

            Pre-Thread Event循環

            每 個線程都可以有它自己的事件循環。初始的線程使用QCoreApplication::exec()來開始它的事件循環;其它的線程可以使用 QThread::exec()來啟動循環。就像QCoreApplication,QThread也提供了一個exit(int)方法和一個 quit()槽。

            線程中的事件循環使得在線程中使用依靠消息循環的非GUI的QT類成為可能(比如QTimer,QTcpSocket,QProcess)。它也使得從任何線程連接信號到一個線程的槽成為可能。這在下面的“信號和槽穿越線程”一節中有詳細解釋。

            一個QObject實例在那個線程中創建,就叫做“活”在那個線程中。給這個對象的事件們通過線程的事件循環派發。一個QObject對象所“活在”的線程通過QObject::thread()可以取得。

            注 意在QApplication之前創建的QObject調用QObject::thread()會返回0.這意味著主線程將只為這些對象處理郵寄的事件; 對于沒有線程的對象,其它的事件處理跟本不會發生。使用QObject::moveToThread()方法來改變對象(和它兒子們)的線程(如果一個對 象有爹,它就不能被移動到另外線程)。

            在擁有對象之外的線程中調用刪除對象是不安全的,除非你能保證在被刪除時不在處理事件。但可以使用 QObject::deleteLater(),它會寄出DeferedDelete事件,對象的線程的事件循環最終會抓住它。默認下,擁有 Qobject的線程就是創建QObject的線程,但在QObject::moveToTread()之后就變了。

            如果沒有事件循環,事件將不能傳給對象。比如,如果你在一個線程中創建一個QTimer對象,但是沒有再調用exec(),那么QTimer將永不能觸發timeout()信號。deleteLater()也不再能工作。(這些也同樣適用于主線程。)

            你可以在任何線程中使用QCoreApp:postEvent()手動向任何對象郵寄事件。事件將被對象所在線程的事件循環自動派發。

            事 件過濾器被所有的線程所支持,但有個限制條件:監視對象必須與被監視對象位于同一個線程中。同樣 的,QCoreApplication::sendEvent()(不同于 QCoreApplication::postEvent())只能在同一線程中的對象之間發送事件。

            從另外線程訪問QObject子類


            QObject和它所有的子類都不是線程安全的,這也包含整個事件派送系統。要記住,當你從另外線程訪問對象時,事件循環可能派送事件到你的QObject子類。

            如果你調用一個非本線程的QObject的子類的函數并且這個對象可能接收事件,你必須用mutex保護所有對你的QObject子類的內部數據的訪問;否則,你可能體驗的什么叫崩潰。

            就像其它對象,QThread對象“活”在創建它的線程中,而不是它自己所代表的線程中。通常在你的QThread子類中提供槽是不安全的,除非你用mutex保護成員變量。

            另一方面,你可以從你的QThread tun()中安全的發出信號,因為信號發射是線程安全的。


            穿越線程的信號和槽們


            Qt支持如下信號-槽連接類型:
             自動連接(默認)- 如果信號是從接收對象所在的線程發出的,其行為與“直接連接”相同。否則,其行為與“隊列連接”相同。
             直接連接- 當信號發出,槽會被立馬調用。此槽在發出者的線程中執行,而不一定是接收者所在的線程。
             隊列連接- 當控制返回到接收者所在線程的事件循環時調用。槽在接收者的線程中執行。
             阻塞的隊列連接- 槽像“隊列連接”那樣被調用,除了一點:當前線程會阻塞住直到槽返回。注:在同一線程中使用此類型的連接將導致死鎖!
             唯一連接- 行為與“自動連接”相同,但連接必須在無復制品時才能建立。也就是,如果在相同的兩個對象之間已經建立了同一個信號到同一個槽的連接,那么連接就不能建立,connect()返回false。

            連接類型可以通過給connect()傳遞一個額外的參數來指定。注意當接收者和發送者位于不同的線程中時,使用“直接連接”,如果事件循環是運行于接收者的線程中,此時是不安全的,同理調用位于另外線程的對象的任何函數都是不安全的。

            QObject::connect()本身是線程安全的。
            posted @ 2013-06-05 16:40 米米 閱讀(1209) | 評論 (0)編輯 收藏

            將動畫們弄到一起


            一個應用通常將包含不止一個動畫。例如,你可能想同時移動多個圖形item也可能順序的一個接一個的移動。
            QanimationGroup 的子類們(QSequentialAnimationGroup和QParallelAnimationGroup)是其它動畫的容器,所以這些動畫既可 以并行也可以串行。QAnimationGroup是一個非屬性動畫的例子,但是它定期的收到時間改變的通知。這使得它可以把時間改變傳輸給所包含的動畫 們,從而控制何時播放那些動畫們。

            讓我們看一下使用QSequentialAnimatoinGroup和QParallelAnimationGroup的代碼示例。
            QPushButton *bonnie = new QPushButton("Bonnie");
            bonnie->show();
            QPushButton *clyde = new QPushButton("Clyde");
            clyde->show();
            QPropertyAnimation *anim1 = new QPropertyAnimation(bonnie, "geometry");
            // Set up anim1
            QPropertyAnimation *anim2 = new QPropertyAnimation(clyde, "geometry");
            // Set up anim2
            QParallelAnimationGroup *group = new QParallelAnimationGroup;
            group->addAnimation(anim1);
            group->addAnimation(anim2);
            group->start();
            一個并行group在同一時刻播放多個動畫。對start()的調用將啟動它所統治的所有的動畫。

            QPushButton button("Animated Button");
            button.show();
            QPropertyAnimation anim1(&button, "geometry");
            anim1.setDuration(3000);
            anim1.setStartValue(QRect(0, 0, 100, 30));
            anim1.setEndValue(QRect(500, 500, 100, 30));
            QPropertyAnimation anim2(&button, "geometry");
            anim2.setDuration(3000);
            anim2.setStartValue(QRect(500, 500, 100, 30));
            anim2.setEndValue(QRect(1000, 500, 100, 30));
            QSequentialAnimationGroup group;
            group.addAnimation(&anim1);
            group.addAnimation(&anim2);
            group.start();
            QsequentialAnimationGroup順序的播放它的動畫們。它在上一個完成時按順序播放下一個。

            既然一個動畫組本就是一個動畫類,你可以把它添加到其它組中。如此,你可以建立起一個動畫樹。


            動畫和狀態
            當 使用狀態機,我們可以使用一個QSignalTransition或QEventTransition類在狀態轉換時連接一個或多個動畫。這些類都是從 QAbstractTransition派生的,它們定義了簡易的函數addAnimation(),使得能夠添加一個或多個動畫,在狀態轉換時啟動這些 動畫。

            我們還可能連接屬性與狀態,而不是手動設置開始與結束值。下面是完整的代碼,演示了動畫一個QPushButton的geometry屬性。

            QPushButton *button = new QPushButton("Animated Button");
            button->show();
            QStateMachine *machine = new QStateMachine;
            QState *state1 = new QState(machine);
            state1->assignProperty(button, "geometry", QRect(0, 0, 100, 30));
            machine->setInitialState(state1);
            QState *state2 = new QState(machine);
            state2->assignProperty(button, "geometry", QRect(250, 250, 100, 30));
            QSignalTransition *transition1 = state1->addTransition(button,
            SIGNAL(clicked()), state2);
            transition1->addAnimation(new QPropertyAnimation(button, "geometry"));
            QSignalTransition *transition2 = state2->addTransition(button,
            SIGNAL(clicked()), state1);
            transition2->addAnimation(new QPropertyAnimation(button, "geometry"));
            machine->start();
            posted @ 2013-06-05 16:40 米米 閱讀(878) | 評論 (0)編輯 收藏

            概述

            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 @ 2013-06-05 16:39 米米 閱讀(827) | 評論 (0)編輯 收藏

            僅列出標題  下一頁
            久久天天躁狠狠躁夜夜躁2O2O| 久久精品一区二区影院| 久久久久成人精品无码| 久久91精品国产91久久户| 久久无码人妻一区二区三区午夜| 久久精品国产乱子伦| 91麻豆国产精品91久久久| 久久久国产视频| 少妇无套内谢久久久久| 久久婷婷五月综合色奶水99啪| 手机看片久久高清国产日韩| 国内精品免费久久影院| 久久激情亚洲精品无码?V| 久久精品无码一区二区三区日韩 | 99国产精品久久| 久久国产精品99精品国产| 久久精品国产91久久综合麻豆自制| 亚洲va久久久噜噜噜久久男同| 久久精品国产亚洲AV无码娇色| 久久精品国产亚洲AV香蕉| 精品国产热久久久福利| 国产成人精品久久亚洲高清不卡 | 香港aa三级久久三级| 久久亚洲精品中文字幕| 99久久久国产精品免费无卡顿| 精品久久久久久无码中文字幕一区| 97久久超碰国产精品旧版 | 91精品国产91久久综合| 久久久这里只有精品加勒比| 精品久久久久中文字| 久久国产成人精品麻豆| 久久精品欧美日韩精品| 欧美大香线蕉线伊人久久| 亚洲国产成人久久综合碰| 久久亚洲国产成人精品无码区| 一本久久久久久久| 18岁日韩内射颜射午夜久久成人| 国产99久久精品一区二区| 久久免费精品视频| 久久99热狠狠色精品一区| 色综合合久久天天综合绕视看|