青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

zhonghua

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

2015年2月2日 #

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

優(yōu)先級

不同級別

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

2.作為style屬性寫在元素內(nèi)的樣式

3.id選擇器

4.類選擇器

5.標(biāo)簽選擇器

6.通配符選擇器

7.瀏覽器自定義

同一級別

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

 

基礎(chǔ)選擇器

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

 

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

組合選擇器

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

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

 

屬性選擇器

 

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

偽類選擇器

 

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

偽元素選擇器

 

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

2014年1月13日 #

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

2014年1月9日 #

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

自動重啟,也就是退出當(dāng)前進(jìn)程,啟動一個(gè)新的進(jìn)程。于是,先看程序如何退出

退出

Qt程序的一般結(jié)構(gòu)如下:

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

最后一句啟動了主線程的事件循環(huán)。而要退出程序,就是要退出這個(gè)事件循環(huán),使main函數(shù)返回。

如何退出?

正確方式:

  • QCoreApplication::exit(int);

它還有一個(gè)馬甲

  • QCoreApplication::quit();

對于QApplication來說,它有一個(gè)常用的屬性

quitOnLastWindowClosed

所以,當(dāng)最后一個(gè)窗口關(guān)閉時(shí),它可以自動調(diào)用前面的exit()

而至于關(guān)閉窗口呢,我們還可以使用

  • QApplication::closeAllWindows()

注:一般來說,對于多個(gè)窗口的程序,調(diào)用這個(gè)會比直接調(diào)用quit要好。因?yàn)檫@樣窗口可以接受到Close事件。

啟動外部程序

在Qt中,做這個(gè)工作的非QProcess莫屬了,要啟動當(dāng)前程序的另一個(gè)進(jìn)程,有要使二者沒有"父子"關(guān)系。恩

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

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

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

當(dāng)然,如果路徑中不包含空格,這個(gè)也可以工作。

重新啟動1

現(xiàn)在簡單了,要重新啟動,只需要調(diào)用

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

或者:

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

重新啟動2

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

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

然后main函數(shù)改成

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

這里面我用了一個(gè)魔數(shù):773,沒什么特別含義,只是因?yàn)槲矣X得

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

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

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

2013年12月11日 #

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

2013年11月17日 #

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

       主要使用QTableView和QTableWidget中的三個(gè)函數(shù)實(shí)現(xiàn)

QTableView::verticalScrollBar()->setSliderPosition()  //設(shè)置當(dāng)前滑動條的位置

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

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

 

 

  1. static int nCurScroller=0; //翻頁時(shí)的當(dāng)時(shí)滑動條位置
  2. static int pageValue = 10; // 一頁顯示條數(shù)

  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(); // 當(dāng)前SCROLLER最大顯示值25
  15.     nCurScroller = hisTableWidget->verticalScrollBar()->value(); //獲得當(dāng)前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(); // 當(dāng)前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翻頁功能實(shí)現(xiàn)

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

2013年9月12日 #

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

TRANSLATIONS += myapp.ts

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

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

2013年6月5日 #

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

一是不能直在堆或棧中生成QToolTip對象。因?yàn)槠錁?gòu)造函數(shù)為私有。
二是從widget獲取的tooltip不是tooltip對象,而是tooltip中的文本。
三是tooltip跟本不是一個(gè)widget。所以不把它當(dāng)作widget用。
四是tooltip類是一個(gè)靜態(tài)類,所以跟本不必生成tooltip對象就可以使用。
五是tooltip類不能被定制,所以不能從它產(chǎn)生各種形狀的tooltip窗口。

QtoolTip有兩種使用方式:
一是靜態(tài)tooltip。比如為一個(gè)widget設(shè)置一個(gè)不變的tooltip文本,當(dāng)鼠標(biāo)移上去時(shí)顯示tooltip。此時(shí)很簡單,只需調(diào)用widget的setToolTip()設(shè)置文本即可。
二是動態(tài)tooltip。也就是一個(gè)widget上的tooltip是變化的。此時(shí)需要重寫QWidget::event()函數(shù),在里面判斷事件類型,如果是QEvent::ToolTip,則控制顯示的文本的內(nèi)容,即可實(shí)現(xiàn)動態(tài)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.  }  
可以看到,是調(diào)用 QtoolTip::showText()在某個(gè)位置顯示tooltip文本。

那么,如果想隨時(shí)顯示tooltip,該怎么做呢?其實(shí)十分簡單:直接調(diào)用QToolTip::showText(),指定要顯示的位置就行了。因?yàn)閠ooltip類的函數(shù)跟本就相當(dāng)于全局函數(shù)而已。

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

QThread從QObject派生。它發(fā)出信號來表明線程開始了或結(jié)束了。并且也提供了幾個(gè)槽。

更有趣的是,QObject可以在多個(gè)程中同時(shí)使用,可以發(fā)出信號給另外線程的槽,以及向“活在”另外線程中的對象郵寄事件。以上之所以能發(fā)生,是因?yàn)槊總€(gè)初程都被允許擁有它自己的事件循環(huán)。

QObject 重入

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

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

在實(shí)際應(yīng)用中,最好的方式是把耗時(shí)的計(jì)算放到主線程中外進(jìn)行,完成后通知主線程顯示結(jié)果。

Pre-Thread Event循環(huán)

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

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

一個(gè)QObject實(shí)例在那個(gè)線程中創(chuàng)建,就叫做“活”在那個(gè)線程中。給這個(gè)對象的事件們通過線程的事件循環(huán)派發(fā)。一個(gè)QObject對象所“活在”的線程通過QObject::thread()可以取得。

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

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

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

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

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

從另外線程訪問QObject子類


QObject和它所有的子類都不是線程安全的,這也包含整個(gè)事件派送系統(tǒng)。要記住,當(dāng)你從另外線程訪問對象時(shí),事件循環(huán)可能派送事件到你的QObject子類。

如果你調(diào)用一個(gè)非本線程的QObject的子類的函數(shù)并且這個(gè)對象可能接收事件,你必須用mutex保護(hù)所有對你的QObject子類的內(nèi)部數(shù)據(jù)的訪問;否則,你可能體驗(yàn)的什么叫崩潰。

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

另一方面,你可以從你的QThread tun()中安全的發(fā)出信號,因?yàn)樾盘柊l(fā)射是線程安全的。


穿越線程的信號和槽們


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

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

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

將動畫們弄到一起


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

讓我們看一下使用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();
一個(gè)并行g(shù)roup在同一時(shí)刻播放多個(gè)動畫。對start()的調(diào)用將啟動它所統(tǒng)治的所有的動畫。

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順序的播放它的動畫們。它在上一個(gè)完成時(shí)按順序播放下一個(gè)。

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


動畫和狀態(tài)
當(dāng) 使用狀態(tài)機(jī),我們可以使用一個(gè)QSignalTransition或QEventTransition類在狀態(tài)轉(zhuǎn)換時(shí)連接一個(gè)或多個(gè)動畫。這些類都是從 QAbstractTransition派生的,它們定義了簡易的函數(shù)addAnimation(),使得能夠添加一個(gè)或多個(gè)動畫,在狀態(tài)轉(zhuǎn)換時(shí)啟動這些 動畫。

我們還可能連接屬性與狀態(tài),而不是手動設(shè)置開始與結(jié)束值。下面是完整的代碼,演示了動畫一個(gè)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 米米 閱讀(907) | 評論 (0)編輯 收藏

概述

Qt動畫架構(gòu)中的主要類如下圖所示:



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


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


復(fù)雜的動畫可以通過建立一個(gè)QAbstractAnimation的樹來構(gòu)建。這個(gè)樹通過使用QAnimationGroups來創(chuàng)建,QAnimationGroups作為其它動畫的容器。注意動畫組也是從QAbstractAnimation派生的,所以動畫組可以再包含其它動畫組。


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


在場景的背后,動畫被一個(gè)全局定時(shí)器收集,這個(gè)定時(shí)器發(fā)送update到所有的正在播放的動畫中。

動畫框架中的類們

QAbstractAnimation

所有動畫類的基類

QAnimationGroup

動畫組的基類

QEasingCurve

控制動畫的寬松曲線類

QParallelAnimationGroup

并行動畫組類

QPauseAnimation

串行動畫組類的暫停類

QPropertyAnimation

動畫Qt屬性的類

QSequentialAnimationGroup

串行動畫組類

QTimeLine

控制動畫的時(shí)間線類

QVariantAnimation

各動畫類的虛基類


動畫Qt屬性們

如前面所講,QPropertyAnimation類可以修改Qt屬性們。要?jiǎng)赢嬕粋€(gè)值,就需要使用此類。實(shí)際上,它的父類,QVariantAnimation,是一個(gè)虛擬類,不能被直接使用。


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

  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秒種內(nèi)從屏幕的左上角移動到(250,250)處。

上面的例子舉在開始值和結(jié)束值之間做線性插值。還可以在開始和結(jié)束值之間設(shè)置值,插值運(yùn)算就會經(jīng)過這些點(diǎn)。


  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秒中內(nèi)弄到(250,250)處,然后在2秒種內(nèi)又弄回原位。移位是在這些點(diǎn)中間以線性插值進(jìn)行的。


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

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

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

動畫和圖形視圖框架

當(dāng)你想動畫QGraphicsItems,你也要用QPropertyAnimation。然而,QGraphicsItem不是從QObject派生的。一個(gè)好的解決方案是派生要?jiǎng)赢嫷膱D形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.     ...  

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

注意:QObject必須是繼承中的第一個(gè),因?yàn)樵獢?shù)據(jù)對象系統(tǒng)需要這樣做。

寬松曲線

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


  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();  

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

posted @ 2013-06-05 16:39 米米 閱讀(861) | 評論 (0)編輯 收藏

僅列出標(biāo)題  下一頁
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费看av成人| 香蕉乱码成人久久天堂爱免费| 亚洲一区二区精品在线| 欧美在线视频免费观看| 欧美成人精品影院| 国产精品一卡| 亚洲人成欧美中文字幕| 亚洲欧美文学| 欧美成年人网| 亚洲愉拍自拍另类高清精品| 久久网站免费| 国产精品视频久久一区| 亚洲福利视频二区| 亚洲综合第一| 欧美二区在线观看| 亚洲男人第一av网站| 欧美成人一区在线| 国产午夜精品理论片a级探花 | 亚洲三级视频在线观看| 香蕉久久夜色| 亚洲人被黑人高潮完整版| 香蕉亚洲视频| 国产精品成人免费| 91久久国产综合久久91精品网站| 欧美一级黄色网| 日韩视频精品在线观看| 久久久噜噜噜久久人人看| 国产精品免费看| 一本一本久久| 亚洲第一狼人社区| 久久精品91久久久久久再现| 国产精品第2页| 亚洲精选一区二区| 免费日韩av片| 欧美一区二区日韩| 国产精品毛片在线看| 日韩亚洲视频在线| 欧美黄色aa电影| 久久久久天天天天| 国产精品网站在线观看| 一区二区免费在线观看| 亚洲国产精品悠悠久久琪琪| 久久久777| 国产一区在线观看视频| 午夜精品在线视频| 一区二区av在线| 欧美人交a欧美精品| 亚洲精品少妇网址| 欧美激情 亚洲a∨综合| 久久午夜羞羞影院免费观看| 激情丁香综合| 久久久亚洲人| 欧美一区二区私人影院日本| 国产精品私人影院| 亚洲免费中文| 亚洲一区欧美| 国产精品美女久久久浪潮软件| 在线亚洲一区观看| 亚洲伦理中文字幕| 欧美激情在线狂野欧美精品| 亚洲精品人人| 亚洲激情一区二区| 欧美紧缚bdsm在线视频| 99re6这里只有精品| 亚洲激情视频在线| 欧美伦理影院| 中文在线资源观看视频网站免费不卡| 亚洲精品影院在线观看| 欧美精品一区二区三区高清aⅴ| 亚洲日本在线观看| 亚洲精品视频啊美女在线直播| 欧美高清一区| 国产精品99久久久久久白浆小说| av成人动漫| 国产精品久久久久久久7电影| 午夜亚洲视频| 欧美一区二区三区视频免费| 国产主播一区| 欧美1区2区| 欧美久久久久久久| 亚洲综合大片69999| 亚洲女爱视频在线| 国内精品美女av在线播放| 久久中文久久字幕| 免费看黄裸体一级大秀欧美| 99视频精品在线| 亚洲午夜久久久久久久久电影网| 国产欧美日韩亚洲| 久久综合久久久久88| 老司机免费视频一区二区| 日韩一级黄色av| 宅男精品导航| 狠狠色狠狠色综合日日91app| 欧美韩国日本一区| 欧美日韩一区二区三区视频| 欧美一区二区三区另类| 久久精品国产一区二区三| 亚洲国产高清在线| 一本色道久久综合狠狠躁篇的优点| 国产精品免费小视频| 久久久噜噜噜| 欧美成人官网二区| 亚洲欧美国产77777| 欧美一区二区三区视频在线观看 | 亚洲黄色av一区| 亚洲精品一区二区三区婷婷月| 国产精品九九| 免费的成人av| 国产精品白丝av嫩草影院 | 亚洲国产精品一区二区三区| 亚洲精品视频在线| 国产日韩欧美综合一区| 亚洲高清视频在线| 国产免费一区二区三区香蕉精| 男人插女人欧美| 国产精品久久久久9999高清| 久热re这里精品视频在线6| 欧美精品一区二区三区视频| 欧美在线日韩精品| 欧美不卡一卡二卡免费版| 午夜在线视频一区二区区别| 免费看精品久久片| 欧美一区深夜视频| 欧美精品午夜| 久久亚洲一区二区| 国产精品久久国产三级国电话系列| 麻豆精品91| 国产精品卡一卡二卡三| 欧美激情亚洲视频| 国产欧美一区二区三区沐欲| 亚洲国产一区在线| 国内精品嫩模av私拍在线观看| 99天天综合性| 亚洲国产日韩一区| 午夜免费在线观看精品视频| 日韩视频一区二区在线观看| 欧美一级艳片视频免费观看| 夜夜嗨av一区二区三区中文字幕| 久久久久国产成人精品亚洲午夜| 亚洲一区二区三区影院| 蜜桃久久精品乱码一区二区| 久久精品视频在线免费观看| 国产精品二区在线| 亚洲娇小video精品| 136国产福利精品导航网址应用 | 韩国视频理论视频久久| 一本一本久久a久久精品综合妖精| 亚洲国产欧美一区二区三区丁香婷| 亚洲欧美综合v| 亚洲在线日韩| 欧美日韩亚洲高清一区二区| 亚洲第一色在线| 伊人婷婷久久| 久久成人在线| 久久国产一区二区| 国产精品久久久久一区二区| 亚洲精品视频一区| 亚洲免费成人| 欧美高潮视频| 免费一级欧美片在线播放| 国产一区二区三区久久久久久久久| 这里只有精品电影| 亚洲一区久久久| 欧美日韩精品二区| 亚洲精品久久在线| 99精品热视频只有精品10| 欧美电影免费网站| 亚洲高清视频的网址| 亚洲国产日韩欧美一区二区三区| 久久久久成人精品| 久久综合图片| 激情成人综合| 久久亚洲视频| 欧美护士18xxxxhd| 亚洲人成人77777线观看| 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲精品免费一二三区| 久久影院午夜片一区| 欧美 亚欧 日韩视频在线| 激情av一区二区| 久久资源av| 亚洲高清av在线| 日韩视频免费在线| 欧美日韩国产综合新一区| 日韩视频在线观看一区二区| 亚洲一级一区| 国产日本欧美一区二区三区在线| 亚洲在线成人| 久久深夜福利| 一区二区三区在线不卡| 久久躁狠狠躁夜夜爽| 欧美高清影院| 一本久久综合亚洲鲁鲁五月天| 欧美日韩一区高清| 亚洲免费伊人电影在线观看av| 欧美一区二区视频网站| 国模叶桐国产精品一区| 久久综合影视| 日韩午夜中文字幕| 欧美一进一出视频|