<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      lyhui - 博客園

      盛年不重來,一日難再晨;及時當勉勵,歲月不待人。

      博客園 首頁 新隨筆 聯系 訂閱 管理

      所有QObject的派生類在官方文檔中都推薦在頭文件中放置宏Q_OBJECT,那么該宏到底為我們做了哪些工作?在qobjectdef.h中有下面的代碼:

       

       

      1. #define Q_OBJECT \  
      2. public: \  
      3.   Q_OBJECT_CHECK \  
      4.   static const QMetaObject staticMetaObject; \  
      5.   Q_OBJECT_GETSTATICMETAOBJECT \  
      6.   virtual const QMetaObject *metaObject() const; \  
      7.   virtual void *qt_metacast(const char *); \  
      8.   QT_TR_FUNCTIONS \  
      9.   virtual int qt_metacall(QMetaObject::Call, intvoid **); \  
      10. private:  

      首先定義了一個Q_OBJECT_CHECK宏,這個宏在Q_OBJECT宏的上方定義:

      1. #define Q_OBJECT_CHECK \  
      2.   template <typename T> inline void qt_check_for_QOBJECT_macro(const T &_q_argument) const \  
      3.   { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i; }  

      Q_OBJECT_CHECK實現了一個模板函數,該函數調用了qYouForgotTheQ_OBJECT_Macro的函數,qYouForgotTheQ_OBJECT_Macro在宏Q_OBJECT_CHECK下面有定義:

      1. template <typename T>  
      2. inline int qYouForgotTheQ_OBJECT_Macro(T, T) { return 0; }  
      3. template <typename T1, typename T2>  
      4. inline void qYouForgotTheQ_OBJECT_Macro(T1, T2) {}  

      從返回值情況上可以看到,調用的是有int返回值的那個模板函數。但是很不明白,為什么之后還要添加一句 i=i?,刨根之后,發現Q_OBJECT_CHECK宏并沒有做什么工作。

      然后Q_OBJECT又幫我們定義了一個靜態的元對象,

      1. static const QMetaObject staticMetaObject; \  
      2. Q_OBJECT_GETSTATICMETAOBJECT \  

      Q_OBJECT_GETSTATICMETAOBJECT宏從名字上看就是為了獲取這個元對象,確實在定義了Q_NO_DATA_RELOCATION宏的情況下,Q_OBJECT_GETSTATICMETAOBJECT宏就為我們定義了獲取靜態元對象的方法。

      1. #ifdef Q_NO_DATA_RELOCATION  
      2. #define Q_OBJECT_GETSTATICMETAOBJECT static const QMetaObject &getStaticMetaObject();  
      3. #else  
      4. #define Q_OBJECT_GETSTATICMETAOBJECT  
      5. #endif  

      之后Q_OBJECT宏又給我們定義了連個虛函數用來獲取元對象指針和設置源對象。

      1. virtual const QMetaObject *metaObject() const; \  
      2. virtual void *qt_metacast(const char *); \  

      而定義的  QT_TR_FUNCTIONS 則表示是否支持I18N

      1. #ifndef QT_NO_TRANSLATION  
      2. # ifndef QT_NO_TEXTCODEC  
      3. // full set of tr functions  
      4. // ### Qt 5: merge overloads  
      5. # define QT_TR_FUNCTIONS \  
      6.   static inline QString tr(const char *s, const char *c = 0) \  
      7.       { return staticMetaObject.tr(s, c); } \  
      8.   static inline QString trUtf8(const char *s, const char *c = 0) \  
      9.       { return staticMetaObject.trUtf8(s, c); } \  
      10.   static inline QString tr(const char *s, const char *c, int n) \  
      11.       { return staticMetaObject.tr(s, c, n); } \  
      12.   static inline QString trUtf8(const char *s, const char *c, int n) \  
      13.       { return staticMetaObject.trUtf8(s, c, n); }  
      14. # else  
      15. // no QTextCodec, no utf8  
      16. // ### Qt 5: merge overloads  
      17. # define QT_TR_FUNCTIONS \  
      18.   static inline QString tr(const char *s, const char *c = 0) \  
      19.       { return staticMetaObject.tr(s, c); } \  
      20.   static inline QString tr(const char *s, const char *c, int n) \  
      21.       { return staticMetaObject.tr(s, c, n); }  
      22. # endif  
      23. #else  
      24. // inherit the ones from QObject  
      25. # define QT_TR_FUNCTIONS  
      26. #endif  

      只要有所實現,tr的方法就通過靜態對象staticMetaObject的tr方法來實現。最后Q_OBJECT又定義了一個虛函數

      1. virtual int qt_metacall(QMetaObject::Call, intvoid **);   

      看名字定義,應該是用來對元對象的調用。

      合起來看所有的Q_OBJECT定義,都是為了操作元對象,并沒有所謂的信號和槽,屬性等內容,很顯然,QObject對象能夠支持這些功能,必然是通過QMetaObject這個元對象來實現的。盡管QMetaObject對象的實現有些龐大,但這個是所有的QOBject中最核心的一個實現,因此需要仔細分析該對象的每個定義:

      1. struct Q_CORE_EXPORT QMetaObject  
      2. {  
      3.   const char *className() const;                                    // 類名  
      4.   const QMetaObject *superClass() const;                            // 父類的元對象  
      5.   QObject *cast(QObject *obj) const;                                // 強制一個對象  
      6. #ifndef QT_NO_TRANSLATION  
      7.   // ### Qt 4: Merge overloads  
      8.   QString tr(const char *s, const char *c) const;                       // 翻譯函數  
      9.   QString trUtf8(const char *s, const char *c) const;  
      10.   QString tr(const char *s, const char *c, int n) const;  
      11.   QString trUtf8(const char *s, const char *c, int n) const;  
      12. #endif // QT_NO_TRANSLATION  
      13.   int methodOffset() const;                                 // 方法偏移量  
      14.   int enumeratorOffset() const;                             // 枚舉偏移量  
      15.   int propertyOffset() const;                                   // 屬性偏移量  
      16.   int classInfoOffset() const;                                  // 類信息數目  
      17.   int constructorCount() const;                             // 構造函數數目  
      18.   int methodCount() const;                                  // 方法數目  
      19.   int enumeratorCount() const;                              // 枚舉數據  
      20.   int propertyCount() const;                                    // 屬性數目  
      21.   int classInfoCount() const;                                   // 類信息數目  
      22.   int indexOfConstructor(const char *constructor) const;            // 構函函數索引  
      23.   int indexOfMethod(const char *method) const;                  // 方法索引  
      24.   int indexOfSignal(const char *signal) const;                  // 信號量索引  
      25.   int indexOfSlot(const char *slot) const;                      // 槽索引  
      26.   int indexOfEnumerator(const char *name) const;                // 枚舉索引  
      27.   int indexOfProperty(const char *name) const;                  // 屬性索引  
      28.   int indexOfClassInfo(const char *name) const;                 // 類信息索引  
      29.   QMetaMethod constructor(int index) const;                 // 構造方法  
      30.   QMetaMethod method(int index) const;                      // 方法  
      31.   QMetaEnum enumerator(int index) const;                        // 枚舉  
      32.   QMetaProperty property(int index) const;                      // 屬性  
      33.   QMetaClassInfo classInfo(int index) const;                    // 類屬性信息      
      34.   QMetaProperty userProperty() const;                           // 用戶屬性  
      35. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////  
      36.   static bool checkConnectArgs(const char *signal, const char *method);  
      37.   static QByteArray normalizedSignature(const char *method);  
      38.   static QByteArray normalizedType(const char *type);  
      39.   // internal index-based connect  
      40.   static bool connect(const QObject *sender, int signal_index,  
      41.                       const QObject *receiver, int method_index,  
      42.                       int type = 0, int *types = 0);  
      43.   // internal index-based disconnect  
      44.   static bool disconnect(const QObject *sender, int signal_index,  
      45.                          const QObject *receiver, int method_index);  
      46.   static bool disconnectOne(const QObject *sender, int signal_index,  
      47.                             const QObject *receiver, int method_index);  
      48.   // internal slot-name based connect  
      49.   static void connectSlotsByName(QObject *o);  
      50.   // internal index-based signal activation  
      51.   static void activate(QObject *sender, int signal_index, void **argv); //obsolete  
      52.   static void activate(QObject *sender, int from_signal_index, int to_signal_index, void **argv); //obsolete  
      53.   static void activate(QObject *sender, const QMetaObject *, int local_signal_index, void **argv);  
      54.   static void activate(QObject *sender, const QMetaObject *, int from_local_signal_index, int to_local_signal_index, void **argv); //obsolete  
      55.   // internal guarded pointers  
      56.   static void addGuard(QObject **ptr);  
      57.   static void removeGuard(QObject **ptr);  
      58.   static void changeGuard(QObject **ptr, QObject *o);  
      59.   static bool invokeMethod(QObject *obj, const char *member,  
      60.                            Qt::ConnectionType,  
      61.                            QGenericReturnArgument ret,  
      62.                            QGenericArgument val0 = QGenericArgument(0),  
      63.                            QGenericArgument val1 = QGenericArgument(),  
      64.                            QGenericArgument val2 = QGenericArgument(),  
      65.                            QGenericArgument val3 = QGenericArgument(),  
      66.                            QGenericArgument val4 = QGenericArgument(),  
      67.                            QGenericArgument val5 = QGenericArgument(),  
      68.                            QGenericArgument val6 = QGenericArgument(),  
      69.                            QGenericArgument val7 = QGenericArgument(),  
      70.                            QGenericArgument val8 = QGenericArgument(),  
      71.                            QGenericArgument val9 = QGenericArgument());  
      72.   static inline bool invokeMethod(QObject *obj, const char *member,  
      73.                            QGenericReturnArgument ret,  
      74.                            QGenericArgument val0 = QGenericArgument(0),  
      75.                            QGenericArgument val1 = QGenericArgument(),  
      76.                            QGenericArgument val2 = QGenericArgument(),  
      77.                            QGenericArgument val3 = QGenericArgument(),  
      78.                            QGenericArgument val4 = QGenericArgument(),  
      79.                            QGenericArgument val5 = QGenericArgument(),  
      80.                            QGenericArgument val6 = QGenericArgument(),  
      81.                            QGenericArgument val7 = QGenericArgument(),  
      82.                            QGenericArgument val8 = QGenericArgument(),  
      83.                            QGenericArgument val9 = QGenericArgument())  
      84.   {  
      85.       return invokeMethod(obj, member, Qt::AutoConnection, ret, val0, val1, val2, val3,  
      86.               val4, val5, val6, val7, val8, val9);  
      87.   }  
      88.   static inline bool invokeMethod(QObject *obj, const char *member,  
      89.                            Qt::ConnectionType type,  
      90.                            QGenericArgument val0 = QGenericArgument(0),  
      91.                            QGenericArgument val1 = QGenericArgument(),  
      92.                            QGenericArgument val2 = QGenericArgument(),  
      93.                            QGenericArgument val3 = QGenericArgument(),  
      94.                            QGenericArgument val4 = QGenericArgument(),  
      95.                            QGenericArgument val5 = QGenericArgument(),  
      96.                            QGenericArgument val6 = QGenericArgument(),  
      97.                            QGenericArgument val7 = QGenericArgument(),  
      98.                            QGenericArgument val8 = QGenericArgument(),  
      99.                            QGenericArgument val9 = QGenericArgument())  
      100.   {  
      101.       return invokeMethod(obj, member, type, QGenericReturnArgument(), val0, val1, val2,  
      102.                                val3, val4, val5, val6, val7, val8, val9);  
      103.   }  
      104.   static inline bool invokeMethod(QObject *obj, const char *member,  
      105.                            QGenericArgument val0 = QGenericArgument(0),  
      106.                            QGenericArgument val1 = QGenericArgument(),  
      107.                            QGenericArgument val2 = QGenericArgument(),  
      108.                            QGenericArgument val3 = QGenericArgument(),  
      109.                            QGenericArgument val4 = QGenericArgument(),  
      110.                            QGenericArgument val5 = QGenericArgument(),  
      111.                            QGenericArgument val6 = QGenericArgument(),  
      112.                            QGenericArgument val7 = QGenericArgument(),  
      113.                            QGenericArgument val8 = QGenericArgument(),  
      114.                            QGenericArgument val9 = QGenericArgument())  
      115.   {  
      116.       return invokeMethod(obj, member, Qt::AutoConnection, QGenericReturnArgument(), val0,  
      117.               val1, val2, val3, val4, val5, val6, val7, val8, val9);  
      118.   }  
      119.   QObject *newInstance(QGenericArgument val0 = QGenericArgument(0),  
      120.                        QGenericArgument val1 = QGenericArgument(),  
      121.                        QGenericArgument val2 = QGenericArgument(),  
      122.                        QGenericArgument val3 = QGenericArgument(),  
      123.                        QGenericArgument val4 = QGenericArgument(),  
      124.                        QGenericArgument val5 = QGenericArgument(),  
      125.                        QGenericArgument val6 = QGenericArgument(),  
      126.                        QGenericArgument val7 = QGenericArgument(),  
      127.                        QGenericArgument val8 = QGenericArgument(),  
      128.                        QGenericArgument val9 = QGenericArgument()) const;  
      129.   enum Call {  
      130.       InvokeMetaMethod,  
      131.       ReadProperty,  
      132.       WriteProperty,  
      133.       ResetProperty,  
      134.       QueryPropertyDesignable,  
      135.       QueryPropertyScriptable,  
      136.       QueryPropertyStored,  
      137.       QueryPropertyEditable,  
      138.       QueryPropertyUser,  
      139.       CreateInstance  
      140.   };  
      141.   int static_metacall(Call, intvoid **) const;  
      142.   static int metacall(QObject *, Call, intvoid **);  
      143. #ifdef QT3_SUPPORT  
      144.   QT3_SUPPORT const char *superClassName() const;  
      145. #endif  
      146.   struct { // private data  
      147.       const QMetaObject *superdata;                         // 父類  
      148.       const char *stringdata;                               // 類名  
      149.       const uint *data;                                     // 任意指向數據的指針  
      150.       const void *extradata;                                    // 擴展數據  
      151.   } d;  
      152. };  

      QMetaObject就內部一個結構體對象,包含了四個部分,分別是父類對象,自己元對象的名稱,以及一個指針任意值的指針數據和擴展數據,一般情況下,d.data表示的是QMetaObjectPrivate對象指針,在priv函數中可以找到一些痕跡:

      1. static inline const QMetaObjectPrivate *priv(const uint* data)  
      2. return reinterpret_cast<const QMetaObjectPrivate*>(data); }  

      按照Qt的實現慣例,使用Private對象做一些具體的工作,于是就有了QMetaObjectPrivate和QObjectPrivate

      1. struct QMetaObjectPrivate                               // 注意是一個結構體  
      2. {  
      3.   int revision;                                         // 版本  
      4.   int className;                                        // 類名,注意類型  
      5.   int classInfoCount, classInfoData;                        // 類信息數據和數量  
      6.   int methodCount, methodData;                          // 方法數據和數量  
      7.   int propertyCount, propertyData;                      // 屬性數據和數量  
      8.   int enumeratorCount, enumeratorData;                  // 枚舉數據和數量  
      9.   int constructorCount, constructorData; //since revision 2     // 構造函數數據和數量      
      10.   int flags; //since revision 3                             // 標記  
      11.   int signalCount; //since revision 4                       // 信號量數目  
      12.   // revision 5 introduces changes in normalized signatures, no new members  
      13.   // 從元數據中獲取QMetaObjectPrivate對象指針,從data中得到!!  
      14.   static inline const QMetaObjectPrivate *get(const QMetaObject *metaobject)  
      15.   { return reinterpret_cast<const QMetaObjectPrivate*>(metaobject->d.data); }   
      16.   static int indexOfSignalRelative(const QMetaObject **baseObject,  
      17.                                    const char* name,  
      18.                                    bool normalizeStringData);  
      19.   static int indexOfSlot(const QMetaObject *m,  
      20.                          const char *slot,  
      21.                          bool normalizeStringData);  
      22.   static int originalClone(const QMetaObject *obj, int local_method_index);  
      23. #ifndef QT_NO_QOBJECT  
      24.   //defined in qobject.cpp  
      25.   enum DisconnectType { DisconnectAll, DisconnectOne };  
      26.   static bool connect(const QObject *sender, int signal_index,  
      27.                       const QObject *receiver, int method_index,  
      28.                       int type = 0, int *types = 0);  
      29.   static bool disconnect(const QObject *sender, int signal_index,  
      30.                          const QObject *receiver, int method_index,  
      31.                          DisconnectType = DisconnectAll);  
      32.   static inline bool disconnectHelper(QObjectPrivate::Connection *c,  
      33.                                       const QObject *receiver, int method_index,  
      34.                                       QMutex *senderMutex, DisconnectType);  
      35. #endif  
      36. };  

      ==================================================================

      1. class Q_CORE_EXPORT QObjectPrivate : public QObjectData  
      2. {  
      3.   Q_DECLARE_PUBLIC(QObject)  
      4. public:  
      5.   struct ExtraData                      // 定義額外數據  
      6.   {  
      7.       ExtraData() {}  
      8. #ifndef QT_NO_USERDATA  
      9.       QVector<QObjectUserData *> userData;  
      10. #endif  
      11.       QList<QByteArray> propertyNames;                    // 屬性名列表  
      12.       QList<QVariant> propertyValues;                     // 屬性值    
      13.   };  
      14.   struct Connection                                     // 定義連接信息  
      15.   {  
      16.       QObject *sender;                                  // 發送者  
      17.       QObject *receiver;                                    // 接受者  
      18.       int method;                                           // 方法  
      19.       uint connectionType : 3; // 0 == auto, 1 == direct, 2 == queued, 4 == blocking  
      20.       QBasicAtomicPointer<int> argumentTypes;             // 參數類型  
      21.       // The next pointer for the singly-linked ConnectionList  
      22.       Connection *nextConnectionList;                       // 下一個連接對象列表  
      23.       //senders linked list  
      24.       Connection *next;                                 // 下一個連接  
      25.       Connection **prev;                                    // 上一個連接  
      26.       ~Connection();  
      27.   };  
      28.   // ConnectionList is a singly-linked list  
      29.   struct ConnectionList {                                   // 定義連接列表  
      30.       ConnectionList() : first(0), last(0) {}                 
      31.       Connection *first;                                    // 連接首  
      32.       Connection *last;                                 // 連接尾  
      33.   };  
      34.   struct Sender                                         // 定義發送者  
      35.   {  
      36.       QObject *sender;                                  // 發送者  
      37.       int signal;                                           // 信號  
      38.       int ref;                                              // 引用計數  
      39.   };  
      40.   QObjectPrivate(int version = QObjectPrivateVersion);  
      41.   virtual ~QObjectPrivate();  
      42.   void deleteChildren();                                        // 刪除所有子節點  
      43.   void setParent_helper(QObject *);                             // 設置父節點  
      44.   void moveToThread_helper();                                   // 轉到某個線程中  
      45.   void setThreadData_helper(QThreadData *currentData, QThreadData *targetData); // 設置線程數據  
      46.   void _q_reregisterTimers(void *pointer);                          // 設置注冊時間  
      47.   bool isSender(const QObject *receiver, const char *signal) const// 判斷信號量是否為發送者  
      48.   QObjectList receiverList(const char *signal) const;               // 接受信號的對象列表  
      49.   QObjectList senderList() const;                               // 發出信息列表  
      50.   void addConnection(int signal, Connection *c);                // 添加一個信號連接  
      51.   void cleanConnectionLists();                              // 清理連接列表  
      52. #ifdef QT3_SUPPORT  
      53.   void sendPendingChildInsertedEvents();  
      54.   void removePendingChildInsertedEvents(QObject *child);  
      55. #endif  
      56.   static inline Sender *setCurrentSender(QObject *receiver,  
      57.                                   Sender *sender);          // 設置當前發送者  
      58.   static inline void resetCurrentSender(QObject *receiver,  
      59.                                  Sender *currentSender,  
      60.                                  Sender *previousSender);   // 重置當前發送者  
      61.   static int *setDeleteWatch(QObjectPrivate *d, int *newWatch); // 設置刪除監聽  
      62.   static void resetDeleteWatch(QObjectPrivate *d, int *oldWatch, int deleteWatch);  // 重置刪除監聽  
      63.   static void clearGuards(QObject *);                   // 清除管理者  
      64.   static QObjectPrivate *get(QObject *o) {          // 從QObject對象中獲取QObjectPrivate    
      65.       return o->d_func();  
      66.   }  
      67.   int signalIndex(const char *signalName) const;            // 信號索引  
      68.   inline bool isSignalConnected(uint signalIdx) const;      // 判斷是否為信號連接  
      69. public:  
      70.   QString objectName;                                   // 對象名字  
      71.   ExtraData *extraData;   // extra data set by the user     // 額外數據  
      72.   QThreadData *threadData; // id of the thread that owns the object     // 線程數據  
      73.   QObjectConnectionListVector *connectionLists;                 // 連接列表數組  
      74.   Connection *senders;    // linked list of connections connected to this object  // 發送者連接  
      75.   Sender *currentSender;  // object currently activating the object         // 當前發送者  
      76.   mutable quint32 connectedSignals[2];                      // 連接信號  
      77. #ifdef QT3_SUPPORT  
      78.   QList<QObject *> pendingChildInsertedEvents;  
      79. #else  
      80.   // preserve binary compatibility with code compiled without Qt 3 support  
      81.   // keeping the binary layout stable helps the Qt Creator debugger  
      82.   void *unused;                                     // 保留  
      83. #endif  
      84.   QList<QPointer<QObject> > eventFilters;  
      85.   union {  
      86.       QObject *currentChildBeingDeleted;                // 當前子節點被刪除  
      87.       QAbstractDeclarativeData *declarativeData; //extra data used by the declarative module  
      88.   };  
      89.   // these objects are all used to indicate that a QObject was deleted  
      90.   // plus QPointer, which keeps a separate list  
      91.   QAtomicPointer<QtSharedPointer::ExternalRefCountData> sharedRefcount; // 共享引用計數  
      92.   int *deleteWatch;         // 刪除監聽者  
      93. };  

      QObjectPrivateQObjectData派生下來:

      1. class  
      2. #if defined(__INTEL_COMPILER) && defined(Q_OS_WIN)  
      3. Q_CORE_EXPORT  
      4. #endif  
      5. QObjectData {  
      6. public:  
      7.   virtual ~QObjectData() = 0;  
      8.   QObject *q_ptr;                               // 當前指向的QOBject  
      9.   QObject *parent;                              // 指向的QObject父類   
      10.   QObjectList children;                         // 孩兒們  
      11.   uint isWidget : 1;                                // 是否為widget的標記   
      12.   uint pendTimer : 1;                           // 開啟時鐘  
      13.   uint blockSig : 1;                                // 阻塞信號標記  
      14.   uint wasDeleted : 1;                          // 是否參數標記  
      15.   uint ownObjectName : 1;                       // 是否含有對象名標記  
      16.   uint sendChildEvents : 1;                     // 發送到子對象時間標記  
      17.   uint receiveChildEvents : 1;                  // 接受子對象時間標記  
      18.   uint inEventHandler : 1;                      // 是否有事件句柄標記  
      19.   uint inThreadChangeEvent : 1;                 // 線程更改時間標記  
      20.   //是否有守護標記  
      21.   uint hasGuards : 1; //true iff there is one or more QPointer attached to this object  
      22.   uint unused : 22;                             // 保留  
      23.   int postedEvents;                             // 發送的數據  
      24.   QMetaObject *metaObject; // assert dynamic            // 元對象  
      25. };  

      QObjectData保留一些了基本的數據信息

      1. #define Q_DECLARE_PUBLIC(Class)                                   \  
      2.   inline Class* q_func() { return static_cast<Class *>(q_ptr); } \  
      3.   inline const Class* q_func() const { return static_cast<const Class *>(q_ptr); } \  
      4.   friend class Class;  

      在元對象中獲取類名和父類的方式很簡單,直接即可。

      1. inline const char *QMetaObject::className() const  
      2. return d.stringdata; }  
      3. inline const QMetaObject *QMetaObject::superClass() const  
      4. return d.superdata; }  

      元對象中cast函數的實現

       view plainprint?

      1. QObject *QMetaObject::cast(QObject *obj) const  
      2. {  
      3.   if (obj) {  
      4.       const QMetaObject *m = obj->metaObject();  
      5.       do {  
      6.           if (m == this)  
      7.               return const_cast<QObject*>(obj);  
      8.       } while ((m = m->d.superdata));  
      9.   }  
      10.   return 0;  
      11. }  

      如果對象obj存在,則對每一個obj的父類的源對象進行轉換,如果是當前的元對象,則進行返回,否則返回0,也就是cast函數是在obj中查找當前元對象所在的QObject對象。

      posted on 2014-05-22 15:58  lyhui  閱讀(380)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩在线视频网| 无码午夜福利片| 国产免费高清69式视频在线观看| 中文字幕乱码一区二区免费| 冀州市| 国产精品入口中文字幕| 性一交一乱一乱一视频| 亚洲欧美日韩人成在线播放| 国产午夜福利视频在线| 亚洲人成网网址在线看| 国产成人人综合亚洲欧美丁香花| 久久久久人妻精品一区三寸| 国产成人啪精品午夜网站| 二区三区亚洲精品国产| 奇米影视7777狠狠狠狠色 | av无码小缝喷白浆在线观看| 国产免费午夜福利在线观看| 亚洲男人天堂2018| 国产涩涩视频在线观看| 狠狠色综合久久狠狠色综合| 欧美激情一区二区| 色五开心五月五月深深爱| 最新亚洲av日韩av二区| 日韩少妇人妻vs中文字幕| 亚洲色成人一区二区三区人人澡人人妻人人爽人人蜜桃麻豆 | 国产一区二区不卡在线视频| 97久久精品人人做人人爽| 内射干少妇亚洲69XXX| 国产精品污www在线观看| 夜夜春久久天堂亚洲精品| 无码吃奶揉捏奶头高潮视频| 国产成人亚洲精品成人区| 亚洲国产精品一区二区久| 2019国产精品青青草原| 国产精品美女一区二三区| 欧美午夜理伦三级在线观看 | 久久亚洲精品中文字幕馆| 久久精品久久精品久久精品| 久久人人97超碰人人澡爱香蕉| 国产伦码精品一区二区| 亚洲顶级裸体av片|