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

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Qt/Qt Quick宏淺議

Posted on 2011-08-05 07:16 RTY 閱讀(850) 評論(0)  編輯 收藏 引用 所屬分類: Qt 、QML

請尊重原創作品和譯文。轉載請保持文章完整性,并以超鏈接形式注明原始作者地址http://blog.csdn.net/changsheng230,方便其他朋友提問和指正。

 

剛開始接觸Qt的朋友可能對Qt在使用當中需要聲明的各色各樣的宏感到神秘而又陌生,本文將介紹Qt中經常使用的幾個宏: Q_OBJECT, SIGNAL與SLOT, Q_SIGNALS 與 Q_SLOTS, Q_EMIT ,Q_INVOKABLE, Q_PROPERTY:

 

宏的頭文件出處: $QTDIR/src/corelib/kernel/qobjectdefs.h

Q_OBJECT

#define Q_OBJECT / 
public: / 
    Q_OBJECT_CHECK / 
    static const QMetaObject staticMetaObject; / 
    Q_OBJECT_GETSTATICMETAOBJECT / 
    virtual const QMetaObject *metaObject() const; / 
    virtual void *qt_metacast(const char *); / 
    QT_TR_FUNCTIONS / 
    virtual int qt_metacall(QMetaObject::Call, int, void **); /

宏Q_OBJECT是Qt所有宏中最為重要的一個,Q_OBJECT是使用信號槽機制以及其他所有元對象系統提供的服務(內省、invokeMethod,元對象property系統等等)的前提條件。有關Q_OBJECT的討論請參考Qt源碼分析之QObject。 

SIGNAL與SLOT

這兩個宏是調用connect方法時用到:

 

  1. QObject::connect(myButton, SIGNAL(clicked()),   
  2.                   label,  SLOT(showText()));  
 

 

那么宏SIGNAL和SLOT為我們做了那些事情呢,看一下源代碼:

 

  1. $QTDIR/src/corelib/kernel/qobjectdefs.h  
  2. # define SLOT(a)     qFlagLocation("1"#a QLOCATION)   
  3. # define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)  
  4. $QTDIR/src/corelib/kernel/qobject.cpp  
  5. const char *qFlagLocation(const char *method)   
  6. {   
  7.     static int idx = 0;   
  8.     flagged_locations[idx] = method;   
  9.     idx = (idx+1) % flagged_locations_count;   
  10.     return method;   
  11. }  
 

 

原來它會基于把我們定義的信號、槽的名稱返回一個字符串,比如SIGNAL(clicked()) 返回字符串 “2clicked()”, SLOT(showText())返回字符串“1showText()”

  1. Q_SIGNALS 與 Q_SLOTS  
  2. #  define slots   
  3. #  define signals protected   
  4. # define Q_SLOTS   
  5. # define Q_SIGNALS protected  
 

 

Q_SIGNALS 與 Q_SLOTS是Qt 4.1引入的,它們用來替換關鍵字signals和slots,原因是更好的與第三方信號槽機制兼容,比如boost庫。盡管Q_SIGNALS 與 Q_SLOTS看起來沒有做什么。其實不然,QT的元對象編譯器moc會識別聲明在頭文件中的宏Q_SIGNALS,Q_SLOTS。并做為依據,生成元對象模型數據,詳見文中最后所示代碼實例

Q_EMIT

#define Q_EMIT #define emit

Q_EMIT用來替換關鍵字emit,原因也是更好的與第三方信號槽機制兼容,比如boost庫。

這里要注意,我們看到Q_EMIT看起來同樣的簡單, 但它們是有區別的!表面的區別在于Q_SIGNALS 與 Q_SLOTS用在頭文件中,而Q_EMIT用在代碼視線中。 本質的區別的在于,Q_SIGNALS 與 Q_SLOTS將被moc識別,是必須使用的。而Q_EMIT或者emit是可有可無的。它不會被moc識別,它存在的唯一理由是:增加代碼的可讀性。  也就是說如下代碼都能正常工作,但2)的寫法也許會惹怒你的同事。

 

  1. void method()  
  2. {  
  3.       1) emit signalA();  
  4.       2) signalA();    
  5. }  
 

 

Q_INVOKABLE

#define Q_INVOKABLE

 

使用Q_INVOKABLE來修飾成員函數,目的在于被修飾的成員函數能夠被元對象系統所喚起。這一機制在Qt C++/QML混合編程,Qt service framework, 以及Qt/ HTML5混合編里廣泛使用。我會隨后另撰寫一文做深入探討。

 

 

Q_PROPERTY

 

#define Q_PROPERTY(text)   

 

使用Q_PROPERTY用以聲明屬性,屬性類似于成員變量,但它能夠被元對象系統所訪問。QML的屬性便是利用該機制得以實現的。 Q_PROPERTY的用法如下:

 

Q_PROPERTY(QString title READ title WRITE setTitle USER true)

 


 

接下來,讓我們結合代碼來看一下上述宏的使用以及元對象編譯器是如何利用這些宏的。

 

 

  1. #include <QDeclarativeItem >  
  2. class EllipseItem : public QDeclarativeItem   
  3. {   
  4.     Q_OBJECT   
  5.     Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)  
  6. public:   
  7.     EllipseItem(QDeclarativeItem *parent = 0);   
  8.     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,   
  9.                QWidget *widget = 0);  
  10.     const QColor &color() const;   
  11.     void setColor(const QColor &newColor);  
  12.     Q_INVOKABLE QColor randomColor() const;  
  13. public Q_SLOTS:   
  14.     void try1();   
  15.     void try2() {}  
  16. Q_SIGNALS:   
  17.     void colorChanged();   
  18.     void ready();  
  19. private:   
  20.     QColor m_color;   
  21. };  
 

 

 

以下代碼由元對象編譯器moc根據上述頭文件自動生成:

 

 

  1. static const uint qt_meta_data_EllipseItem[] = {  
  2. // content:   
  3.        5,       // revision   
  4.        0,       // classname   
  5.        0,    0, // classinfo   
  6.        5,   14, // methods   
  7.        1,   39, // properties   
  8.        0,    0, // enums/sets   
  9.        0,    0, // constructors   
  10.        0,       // flags   
  11.        2,       // signalCount  
  12. // signals: signature, parameters, type, tag, flags   
  13.       13,   12,   12,   12, 0x05,   
  14.       28,   12,   12,   12, 0x05,  
  15. // slots: signature, parameters, type, tag, flags   
  16.       36,   12,   12,   12, 0x0a,   
  17.       43,   12,   12,   12, 0x0a,  
  18. // methods: signature, parameters, type, tag, flags   
  19.       57,   12,   50,   12, 0x02,  
  20. // properties: name, type, flags   
  21.       71,   50, 0x43495103,  
  22. // properties: notify_signal_id   
  23.        0,  
  24.        0        // eod   
  25. };  
  26. static const char qt_meta_stringdata_EllipseItem[] = {   
  27.     "EllipseItem/0/0colorChanged()/0ready()/0"   
  28.     "try1()/0try2()/0QColor/0randomColor()/0"   
  29.     "color/0"   
  30. };  
 

 

 

從上面代碼實例我們可以看到, QT的元對象編譯器moc會識別聲明在頭文件中的宏Q_SIGNALS,Q_SLOTS, Q_PROPERTY, Q_PROPERTY。并以此做為依據,生成了元對象數據表。在這張元對象數據表中,我們已可以看到,moc根據頭文件所聲明的宏定義,識別出:

  • 兩個信號:colorChanged(), ready();      (Q_SIGNALS)
  • 兩個槽:    try1(), try2()                          (Q_SLOTS)
  • 五個方法,其中被標記為Q_INVOKABLE的方法randomColor()被記錄在元對象字符串數組qt_meta_stringdata_EllipseItem中。  
  • 一個屬性:color   (Q_PROPERTY)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 欧美日韩免费视频| 欧美日韩二区三区| 欧美三级网页| 国产精品视频精品视频| 国产精品自拍小视频| 国产精品入口福利| 国内精品久久久| 在线观看日韩专区| 亚洲美女色禁图| 午夜精品亚洲| 老司机午夜精品视频| 亚洲国产婷婷综合在线精品| 米奇777在线欧美播放| 亚洲国产小视频| 亚洲欧美在线视频观看| 久久一区二区三区四区五区| 欧美国产日韩一二三区| 国产精品美女黄网| 亚洲国产精品ⅴa在线观看 | **网站欧美大片在线观看| 亚洲人成在线播放| 亚洲欧美色一区| 亚洲二区在线视频| 亚洲在线成人| 欧美a级理论片| 国产欧美一区二区精品忘忧草| 亚洲国产成人精品久久| 亚洲欧美国产毛片在线| 欧美一区二区三区四区在线| 美女精品在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久精品免费电影| 欧美午夜精品久久久| 在线不卡中文字幕| 欧美一级片久久久久久久| 亚洲高清在线观看一区| 亚洲欧洲av一区二区| 欧美日本视频在线| 亚洲国产99精品国自产| 久久精品日韩一区二区三区| 亚洲人成亚洲人成在线观看| 久久精品女人天堂| 国产精品推荐精品| 亚洲影院免费| 亚洲人午夜精品免费| 美女视频黄a大片欧美| 国产一区二区看久久| 亚洲欧美制服另类日韩| 亚洲美女毛片| 欧美国产日本在线| 亚洲黄色av| 美女视频网站黄色亚洲| 欧美一二三区在线观看| 国产精品视频久久一区| 亚洲永久免费av| 一二美女精品欧洲| 欧美日韩视频| 亚洲无线观看| 亚洲精品一区久久久久久| 欧美 日韩 国产在线| 最新日韩在线| 亚洲国产日韩欧美| 欧美护士18xxxxhd| 日韩一本二本av| 亚洲精品久久久蜜桃| 欧美激情亚洲激情| 亚洲深夜福利网站| 亚洲天堂久久| 国产视频精品网| 美女图片一区二区| 欧美成人免费全部观看天天性色| 亚洲日本欧美| 一区二区三区欧美视频| 国产精品一区视频网站| 久久久久久一区| 久久只有精品| 一本一本久久| 亚洲欧美一区二区在线观看| 黄色成人91| 亚洲精品国产精品乱码不99| 欧美体内谢she精2性欧美| 性欧美大战久久久久久久久| 久久精彩视频| 99精品99| 欧美一区二区三区免费大片| 亚洲福利一区| 中文av一区特黄| 亚洲专区在线视频| 午夜精品久久久久久久蜜桃app| 国产欧美日韩综合| 欧美xx视频| 欧美午夜精品久久久久久孕妇| 久久精彩视频| 欧美人在线视频| 久久久国产午夜精品| 欧美国产精品人人做人人爱| 午夜精品免费在线| 女人香蕉久久**毛片精品| 亚洲欧美制服中文字幕| 久久综合色天天久久综合图片| 在线中文字幕不卡| 久久精品在线| 亚洲欧美日韩第一区| 久久久国产一区二区| 亚洲综合日韩| 正在播放亚洲| 亚洲国产精品一区二区第四页av | 亚洲一区尤物| 久久久久久夜| 亚洲欧美日韩中文视频| 女主播福利一区| 久久久久一本一区二区青青蜜月| 欧美日韩和欧美的一区二区| 另类春色校园亚洲| 国产日韩精品一区二区三区| 亚洲免费观看在线观看| 亚洲国产精品成人久久综合一区| 亚洲你懂的在线视频| 一区二区三区免费网站| 免费看成人av| 国产麻豆精品视频| 欧美一区二区女人| 狼人社综合社区| 久久精品国产综合精品| 欧美手机在线视频| 亚洲黄网站黄| 亚洲国产欧美一区二区三区丁香婷| 亚洲欧美日韩一区在线| 亚洲一区二区三区乱码aⅴ| 欧美v亚洲v综合ⅴ国产v| 免费观看久久久4p| 激情五月综合色婷婷一区二区| 午夜天堂精品久久久久| 欧美在线观看一区二区| 国产精品亚洲综合一区在线观看| 宅男噜噜噜66国产日韩在线观看| 99re热这里只有精品视频| 欧美黄色一区| 亚洲日本va午夜在线影院| 亚洲另类春色国产| 欧美日韩第一区日日骚| 亚洲精品中文在线| 一本不卡影院| 欧美午夜一区| 亚洲女与黑人做爰| 久久精品国产第一区二区三区最新章节| 国产精品免费网站| 亚洲欧美日韩在线| 亚洲黄色片网站| 一本综合久久| 欧美成人嫩草网站| 91久久精品国产91性色| 日韩午夜在线观看视频| 欧美日韩视频一区二区三区| 99国产精品一区| 亚洲香蕉视频| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 国产自产精品| 老司机久久99久久精品播放免费| 欧美激情第五页| 中文在线一区| 国产女主播一区二区三区| 久久精品人人做人人爽| 欧美激情第1页| 午夜精品视频在线| 亚洲国产精品尤物yw在线观看| 欧美风情在线| 亚洲欧美另类综合偷拍| 欧美国产亚洲精品久久久8v| 一区二区不卡在线视频 午夜欧美不卡在 | 国产一区二区三区在线观看视频| 久久久免费av| 一区二区三区你懂的| 久久亚洲不卡| 亚洲一区二区视频| 国产午夜精品一区理论片飘花| 欧美1区2区3区| 亚洲欧美一级二级三级| 欧美激情精品久久久久久久变态| 亚洲一区二区欧美| 亚洲成人在线网| 国产欧美一二三区| 欧美日韩精品综合| 久久美女性网| 亚欧美中日韩视频| 亚洲午夜精品国产| 亚洲精品久久久久久一区二区| 久久久久久久激情视频| 一本色道久久综合亚洲精品小说 | 一级日韩一区在线观看| 老司机免费视频一区二区三区| 亚洲综合色激情五月| 国语自产精品视频在线看抢先版结局 | 久久国产精品网站| 亚洲毛片在线观看.| 免费看亚洲片| 久久久久久欧美| 午夜综合激情|