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

zhonghua

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

Qt提供了一個絕妙的屬性系統(tǒng)。跟那些由編譯器提供的屬性差不多。然而,作為一個獨(dú)立于編譯器和平臺的庫,Qt不依賴于非標(biāo)準(zhǔn)的編譯特性,比如 __property 或[property]。Qt可以在任何平臺上的標(biāo)準(zhǔn)編譯器下編譯。Qt屬性系統(tǒng)基于元數(shù)據(jù)對象系統(tǒng)--就是那個提供了對象內(nèi)置信號和槽通訊機(jī)制的家伙。


聲明屬性需要什么


要聲明一個屬性,需在繼承自QObject的類中使用Q_PROPERTY()宏。
Q_PROPERTY(type name
   READ getFunction
   [WRITE setFunction]
   [RESET resetFunction]
   [NOTIFY notifySignal]
   [DESIGNABLE bool]
   [SCRIPTABLE bool]
   [STORED bool]
   [USER bool]
   [CONSTANT]
   [FINAL])

下面是一些典型的聲明屬性的示例:

  1. Q_PROPERTY(bool focus READ hasFocus)  
  2. Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)  
  3. Q_PROPERTY(QCursor cursor READ cursor WRITE setCursor RESET unsetCursor)  
  • 一個屬性的行為就像類的數(shù)據(jù)成員,但是它還具有附加的特性,這些特性可以被元數(shù)據(jù)對象系統(tǒng)操作。這些特性是:
    需要一個READ訪問器函數(shù)。用于讀屬性的值。理想情況下,有一個不變的函數(shù)用于此目的,并且它必須返回屬性的類型的值或指針或引用。例如,QWidget::focus是一個只讀的屬性,它對應(yīng)一個讀函數(shù):QWidget::hasFocus()。
  • 一 個可選的WRITE訪問器函數(shù)。它用于設(shè)置屬性的值。它必須返回空并且至少具有一個參數(shù),參數(shù)是屬性類型的值或指針或引用。例 如:QWidget::enabled具有WRITE函數(shù)QWidget::setEnable()。只讀屬性不需要寫函數(shù)。例 如,QWidget::focus沒有對應(yīng)的寫函數(shù)。
  • 一個可選的RESET函數(shù)。用于設(shè)置屬性的值到它的默認(rèn)值。例 如:QWidget::cursor具有典型的READ和WRITE函數(shù),QWidget::cursor()和 QWidget::setCursor(),并且它也具有一個RESET函數(shù),QWidget::unsetCursor()。RESET函數(shù)必須返回 void并且不帶有任何參數(shù)。
  • 一個可選的NOTIFY信號。如果被定義了,信號將在屬性的值改變時發(fā)出。信號必須帶有一個參數(shù),這個參數(shù)的類型必須與屬性相同;參數(shù)保存的是屬性的新值。
  • 一個DESIGNABLE變量表明此屬性是否在界面設(shè)計(jì)器的屬性編輯器中出現(xiàn)。大多數(shù)屬性是可見的,除了為這個變量傳入true或false,你還可以指定一個bool型的成員函數(shù)。
  • SCRIPTABLE變量表明這個屬性是否可以被一個腳本引擎操作(默認(rèn)是true)。你也可以賦予它true或false或bool型函數(shù)。
  • STORED 變量表明了屬性是否被認(rèn)為是獨(dú)立存在還是依賴于其它的值而存在。它也表明是否在保存對象狀態(tài)時保存此屬性的值。大多數(shù)屬性都是需要保存的,但是,如 QWidget::minimumWidth()就是不被保存的,因?yàn)樗闹凳菑牧硪粋€屬性QWidget::minimumSize()得來的。
  • USER變量表明屬性是否被設(shè)計(jì)為面向用戶的或用戶可修改的類屬性。通常,每個類只有一個USER屬性。例如,QAbstractButton::checked是按鈕類的用戶可修改屬性。注意QItemDelegate獲取和設(shè)置widget的USER屬性。
  • CONSTANT的出現(xiàn)表明屬性的值是不變的。對于一個object實(shí)例,常量屬性的READ方法在每次被調(diào)用時必須返回相同的值。此常量值可能在不同的object實(shí)例中不相同。一個常量屬性不能具有WRITE方法或NOYIFY信號。
  • FINAL變量的出現(xiàn)表明屬性不能被派生類所重寫。有些情況下,這可以用于效率優(yōu)化,但不是被moc強(qiáng)制的。程序員必須永遠(yuǎn)注意不能重寫一個FINAL屬性。

READ,WRITE和RESET函數(shù)都可以被繼承。它們也可以是虛函數(shù)。當(dāng)它們在被多重繼承中被繼承時,它們必須出現(xiàn)在第一個被繼承的類中。

屬性的類型可以是被QVariant支持的所有類型,也可以是用戶定義的類型。在下面的例子中,類QDate被當(dāng)作用戶自定義類型。
Q_PROPERTY(QDate data READ getDate WRITE setDate)
因?yàn)镼Date是用戶定義的,你必須包含<QDate>頭文件。

對 于QMap,QList和QValueList屬性,屬性的值是一個QVariant,它包含整個list或map。注意Q_PROPERTY字符串不能 包含逗號,因?yàn)槎禾枙澐趾甑膮?shù)。因此,你必須使用QMap作為屬性的類型而不是QMap<QString,QVariant>。為了保持 一致性,也需要用QList和QValueList而不是QList<QVariant>和 QValueList<QVariant>。


通過元數(shù)據(jù)對象系統(tǒng)讀寫屬性

一 個屬性可以使用常規(guī)函數(shù)QObject::property()和QObject::setProperty()進(jìn)行讀寫,不用知道屬性所在類的任何細(xì) 節(jié),除了屬性的名字。在下面的小代碼片段中,調(diào)用QAbstractButton::setDown()和QObject::setProperty() 都把屬性設(shè)置為“down”。

  1. QPushButton *button = new QPushButton;  
  2. QObject *object = button;  
  3. button->setDown(true);  
  4. object->setProperty("down", true);  

通 過WRITE操作器來操作一個屬性是上面兩者中更好的,因?yàn)樗觳⑶以诰幾g時給于更好的診斷幫助,但是以這種方式設(shè)置屬性要求你必須在編譯時了解其類。通 過名字來操作屬性使你可以操作在編譯器你不了解的類。你可以在運(yùn)行時發(fā)現(xiàn)一個類的屬性們,通過查詢它的QObject,QMetaObject和 QMetaProerties。

  1. QObject *object = ...  
  2. const QMetaObject *metaobject = object->metaObject();  
  3. int count = metaobject->propertyCount();  
  4. for (int i=0; i<count; ++i) {  
  5.     QMetaProperty metaproperty = metaobject->property(i);  
  6.     const char *name = metaproperty.name();  
  7.     QVariant value = object->property(name);  
  8.     ...  
  9. }  

在上面的代碼片段中,QMetaObject::property()被用于獲取未知類中的屬性的metadata。從metadata中獲取屬性名然后傳給QObject::property()來獲取

一個簡單例子


假 設(shè)我們有一個類MyClass,它從QObject派生并且在它的private區(qū)使用 了Q_OBJECT宏。我們想在MyClass類中聲明一個屬性來持續(xù)追蹤一個Priorty值。屬性的值叫做priority,并且它的類型是一個在類 MyClass中定義的叫做Priority的枚舉。

我們在類的private區(qū)使用Q_PROPERTY()來聲明屬性。READ函數(shù) 叫做priority,并且我們包含一個WRITE函數(shù)叫做setPriority。枚舉類型必須使用Q_ENUMS()注冊到元數(shù)據(jù)對象系統(tǒng)中。注冊一 個枚舉類型使得枚舉的名字可以在調(diào)用QObject::setProperty()時使用。我們還必須為READ和WRITE函數(shù)提供我們自己的聲明。 MyClass的聲明看起來應(yīng)該是這樣的:

  1. class MyClass : public QObject  
  2. {  
  3.     Q_OBJECT  
  4.     Q_PROPERTY(Priority priority READ priority WRITE setPriority)  
  5.     Q_ENUMS(Priority)  
  6. public:  
  7.     MyClass(QObject *parent = 0);  
  8.     ~MyClass();  
  9.     enum Priority { High, Low, VeryHigh, VeryLow };  
  10.     void setPriority(Priority priority);  
  11.     Priority priority() const;  
  12. };  

READ函數(shù)是const的并且返回屬性的類型。WRITE函數(shù)返回void并且具有一個屬性類型的參數(shù)。元數(shù)據(jù)對象編譯器強(qiáng)制做這些事情。

在有了一個指向MyClass實(shí)例的指針時,我們有兩種方法來設(shè)置priority屬性:

  1. MyClass *myinstance = new MyClass;  
  2.  QObject *object = myinstance;  
  3.  myinstance->setPriority(MyClass::VeryHigh);  
  4.  object->setProperty("priority", "VeryHigh");  

在 此例子中,枚舉類型在MyClass中聲明并被使用Q_ENUMS()注冊到元數(shù)據(jù)對象系統(tǒng)中。這使得枚舉值可以在調(diào)用setProperty()時做為 字符串使用。如果枚舉類型是在其它類中聲明的,那么我們就需要用枚舉的全名(如OtherClass::Priority),并且這個其它類也必須從 QObject中派生并且也要注冊枚舉類型。
另一個簡單的Q_FLAGS()也是可用的。就像Q_ENUMS(),它注冊一個枚舉類型,但是它把 枚舉類型作為一個flag的集合,也就是,值可以用OR操作來合并。一個I/O類可能具有枚舉值Read和Write并且 QObject::setProperty()可以接受 Read|Write。此時應(yīng)使用Q_FLAGS()來注冊枚舉值。

動態(tài)屬性

Qobject::setProperty() 也可以用來在運(yùn)行時向一個類的實(shí)例添加新的屬性。當(dāng)使用一個名字和值調(diào)用它時,如果一個對應(yīng)的屬性已經(jīng)存在,并且如果值的類型與屬性的類型兼容,那么值就 被存儲到屬性中,然后返回true。如果值類型不兼容,屬性的值就不會發(fā)生改變,就會返回false。但是如果對應(yīng)名字的屬性不存在,那么一個新的屬性就 誕生了,以傳入的名字為名,以傳入的值為值,但是依然會返回false。這表示返回值不能用于確定一個屬性是否被設(shè)置值,除非你已經(jīng)知道這個屬性已經(jīng)存在 于QObject中了。
注意動態(tài)屬性被添加到單個實(shí)現(xiàn)的基礎(chǔ)中,也就是,被添加到QObject,而不是QMetaObject。一個屬性可以從 一個實(shí)例中刪除,通過傳入屬性的名字和非法的QVariant值給QObject::setProperty()。默認(rèn)的QVariant構(gòu)造器構(gòu)造一個 非法的QVariant。
動態(tài)屬性可用QObject::property()來查詢,就行使用Q_PROPERTY()聲明的屬性一樣。

屬性和自定義類型

被屬性使用的自定義類型需要使用Q_DECLARE_METATYPE()宏注冊,以使它們的值能被保存在QVariant對象中。這使得它們可以用于被Q_PROPERTY()聲明的靜態(tài)類型中,也可以被用于動態(tài)類型中。

posted on 2013-06-05 09:53 米米 閱讀(1042) 評論(0)  編輯 收藏 引用 所屬分類: qt
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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在线免费观看| 久久精品卡一| 欧美一区二区三区喷汁尤物| 欧美精品免费视频| 欧美激情一二区| 国外成人网址| 午夜精品理论片| 亚洲欧美成人一区二区在线电影 | 一本到高清视频免费精品| 久久精品日韩| 欧美亚洲一区在线| 欧美深夜福利| 99在线热播精品免费| 日韩午夜在线视频| 欧美精品成人91久久久久久久| 狂野欧美一区| 好吊日精品视频| 久久成人精品一区二区三区| 久久精品日韩欧美| 国产欧美日韩一区二区三区| 亚洲欧美99| 久久久不卡网国产精品一区| 国产日韩欧美麻豆| 欧美一区国产二区| 久久亚洲欧洲| 亚洲国产日韩一区| 欧美国产日韩a欧美在线观看| 欧美激情视频在线播放| 亚洲日韩成人| 欧美好骚综合网| 亚洲精品一线二线三线无人区| 99亚洲精品| 欧美网站在线| 亚洲欧美综合精品久久成人| 欧美影院一区| 一区二区在线观看av| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美激情欧美狂野欧美精品| 99精品视频免费观看视频| 欧美精品二区| 亚洲一区激情| 蜜臀91精品一区二区三区| 亚洲成色777777在线观看影院| 狼狼综合久久久久综合网| 亚洲国产乱码最新视频| 一本色道久久综合亚洲精品不卡| 欧美日韩在线播放三区| 午夜电影亚洲| 欧美刺激性大交免费视频| 亚洲美女在线观看| 国产精品视频一区二区三区| 久久av在线| 亚洲人在线视频| 久久国产精品色婷婷| 亚洲国产精品久久人人爱蜜臀| 欧美激情亚洲激情| 性娇小13――14欧美| 欧美激情欧美狂野欧美精品 | 亚洲国产二区| 欧美三级电影精品| 久久久久91| 99精品视频免费在线观看| 久久久亚洲国产天美传媒修理工| 最新高清无码专区| 国产精品一区二区久久久久| 免费不卡中文字幕视频| 亚洲天堂男人| 欧美国产精品人人做人人爱| 亚洲欧美国产视频| 91久久午夜| 国产一区二区三区免费在线观看 | 欧美乱妇高清无乱码| 亚洲欧美中文日韩v在线观看| 亚洲高清视频一区| 久久久亚洲精品一区二区三区| 日韩一级在线观看| 永久域名在线精品| 国产女主播视频一区二区| 欧美激情一区二区| 久久免费99精品久久久久久| 亚洲欧美激情一区| 日韩视频在线一区二区| 欧美激情导航| 久久午夜羞羞影院免费观看| 午夜精品国产更新| 亚洲一区二区三区在线看| 亚洲精品一线二线三线无人区| 国产真实乱偷精品视频免| 国产精品高潮呻吟| 欧美日韩中文在线| 欧美好吊妞视频| 亚洲麻豆av| 欧美激情第3页| 另类人畜视频在线| 亚洲天堂免费观看| 亚洲最快最全在线视频| 亚洲成色www8888| 亚洲国产一区在线| 亚洲电影在线免费观看| 国内精品久久久久影院优| 国产精品亚发布| 欧美性天天影院| 欧美午夜精品久久久久免费视 | 亚洲国产一成人久久精品| 激情国产一区| 在线不卡中文字幕播放| 一区二区三区自拍| 在线欧美视频| 亚洲福利在线视频| 亚洲欧洲一区二区三区久久| 亚洲国内自拍| 亚洲精品一区二区三区樱花| 亚洲精品一区二区三区婷婷月 | 亚洲国产精品一区在线观看不卡 | 欧美一站二站| 欧美有码在线视频| 久久五月天婷婷| 欧美成人蜜桃| 亚洲电影免费观看高清完整版在线观看| 欧美1区2区3区| 最新成人在线| 中国女人久久久| 欧美亚洲免费高清在线观看| 午夜精品理论片| 久久在线播放| 欧美日韩国产精品一区| 国产精品高清免费在线观看| 国产精品一区二区三区久久| 国产主播一区二区三区| 在线观看亚洲a| 亚洲日本久久| 亚洲男人影院| 久热精品视频在线免费观看| 亚洲国产经典视频| 在线视频免费在线观看一区二区| 亚洲欧美日韩精品久久亚洲区 | 久久99伊人| 久久综合狠狠| 亚洲日本va午夜在线影院| 亚洲免费影视| 久久综合九色综合久99| 欧美日韩亚洲另类| 黄色成人在线网站| 99综合视频| 久久久久久网| 99re6这里只有精品视频在线观看| 亚洲女人天堂成人av在线| 男男成人高潮片免费网站| 国产精品免费在线 | 亚洲精选中文字幕| 欧美一区二区三区在| 欧美激情在线播放| 亚洲在线视频观看| 免费高清在线一区| 国产日韩一区欧美| 亚洲少妇中出一区| 欧美成人精品高清在线播放| 一本久久综合亚洲鲁鲁五月天| 久久久久99精品国产片| 国产精品sss| 亚洲精品久久久久久一区二区 | 欧美一区二区三区在线观看视频| 欧美成人免费全部观看天天性色| 国产欧美一区二区精品性色| 一本大道久久a久久综合婷婷| 久久久欧美一区二区| 亚洲一级免费视频| 欧美日韩二区三区| 亚洲人成毛片在线播放| 久久久久www| 亚洲一区二区三区在线观看视频 | 亚洲永久在线观看| 亚洲国产精选| 久久综合一区二区| 在线观看欧美日韩国产| 久久电影一区| 亚洲一区二区三区777| 欧美日韩精品一区| 亚洲精品欧美激情| 亚洲电影自拍| 免费不卡在线观看| 在线精品福利| 免费成人黄色| 久久精品主播| 国产欧美1区2区3区| 西西人体一区二区| 亚洲无限乱码一二三四麻| 欧美视频第二页| 亚洲一区二区成人| 这里只有精品在线播放| 国产精品激情电影| 欧美亚洲日本网站| 亚洲欧美日韩视频二区| 国产日韩精品久久久| 亚洲欧美综合一区| 香蕉久久夜色精品国产使用方法| 国产人成一区二区三区影院| 欧美一区二区视频在线观看|