QObject类 moc处理后代码

QObject在QT中是所有类的基类,经过MOC处理后代码如下

之所以贴出这段代码,是因为很多流程追踪到最后一些关键性函数都是出自这个类

源码 4.8.6 MOC版本 63

1 /****************************************************************************
  2 ** Meta object code from reading C++ file 'qobject.h'
  3 **
  4 ** Created by: The Qt Meta Object Compiler version 63 (Qt 4.8.6)
  5 **
  6 ** WARNING! All changes made in this file will be lost!
  7 *****************************************************************************/
  8 
  9 #include "qobject.h"
 10 #if !defined(Q_MOC_OUTPUT_REVISION)
 11 #error "The header file 'qobject.h' doesn't include <QObject>."
 12 #elif Q_MOC_OUTPUT_REVISION != 63
 13 #error "This file was generated using the moc from 4.8.6. It"
 14 #error "cannot be used with the include files from this version of Qt."
 15 #error "(The moc has changed too much.)"
 16 #endif
 17 
 18 QT_BEGIN_MOC_NAMESPACE
 19 static const uint qt_meta_data_QObject[] = {
 20 
 21  // content:
 22        6,       // revision
 23        0,       // classname
 24        0,    0, // classinfo
 25        4,   14, // methods
 26        1,   34, // properties
 27        0,    0, // enums/sets
 28        2,   37, // constructors
 29        0,       // flags
 30        2,       // signalCount
 31 
 32  // signals: signature, parameters, type, tag, flags
 33        9,    8,    8,    8, 0x05,
 34       29,    8,    8,    8, 0x25,
 35 
 36  // slots: signature, parameters, type, tag, flags
 37       41,    8,    8,    8, 0x0a,
 38       55,    8,    8,    8, 0x08,
 39 
 40  // properties: name, type, flags
 41       90,   82, 0x0a095103,
 42 
 43  // constructors: signature, parameters, type, tag, flags
 44      108,  101,    8,    8, 0x0e,
 45      126,    8,    8,    8, 0x2e,
 46 
 47        0        // eod
 48 };
 49 
 50 static const char qt_meta_stringdata_QObject[] = {
 51     "QObject\0\0destroyed(QObject*)\0destroyed()\0"
 52     "deleteLater()\0_q_reregisterTimers(void*)\0"
 53     "QString\0objectName\0parent\0QObject(QObject*)\0"
 54     "QObject()\0"
 55 };
 56 
 57 void QObject::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
 58 {
 59     if (_c == QMetaObject::CreateInstance) {
 60         switch (_id) {
 61         case 0: { QObject *_r = new QObject((*reinterpret_cast< QObject*(*)>(_a[1])));
 62             if (_a[0]) *reinterpret_cast<QObject**>(_a[0]) = _r; } break;
 63         case 1: { QObject *_r = new QObject();
 64             if (_a[0]) *reinterpret_cast<QObject**>(_a[0]) = _r; } break;
 65         }
 66     } else if (_c == QMetaObject::InvokeMetaMethod) {
 67         Q_ASSERT(staticMetaObject.cast(_o));
 68         QObject *_t = static_cast<QObject *>(_o);
 69         switch (_id) {
 70         case 0: _t->destroyed((*reinterpret_cast< QObject*(*)>(_a[1]))); break;
 71         case 1: _t->destroyed(); break;
 72         case 2: _t->deleteLater(); break;
 73         case 3: _t->d_func()->_q_reregisterTimers((*reinterpret_cast< void*(*)>(_a[1]))); break;
 74         default: ;
 75         }
 76     }
 77 }
 78 
 79 const QMetaObjectExtraData QObject::staticMetaObjectExtraData = {
 80     0,  qt_static_metacall 
 81 };
 82 
 83 const QMetaObject QObject::staticMetaObject = {
 84     { 0, qt_meta_stringdata_QObject,
 85       qt_meta_data_QObject, &staticMetaObjectExtraData }
 86 };
 87 
 88 #ifdef Q_NO_DATA_RELOCATION
 89 const QMetaObject &QObject::getStaticMetaObject() { return staticMetaObject; }
 90 #endif //Q_NO_DATA_RELOCATION
 91 
 92 const QMetaObject *QObject::metaObject() const
 93 {
 94     return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
 95 }
 96 
 97 void *QObject::qt_metacast(const char *_clname)
 98 {
 99     if (!_clname) return 0;
100     if (!strcmp(_clname, qt_meta_stringdata_QObject))
101         return static_cast<void*>(const_cast< QObject*>(this));
102     return 0;
103 }
104 
105 int QObject::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
106 {
107     if (_id < 0)
108         return _id;
109     if (_c == QMetaObject::InvokeMetaMethod) {
110         if (_id < 4)
111             qt_static_metacall(this, _c, _id, _a);
112         _id -= 4;
113     }
114 #ifndef QT_NO_PROPERTIES
115       else if (_c == QMetaObject::ReadProperty) {
116         void *_v = _a[0];
117         switch (_id) {
118         case 0: *reinterpret_cast< QString*>(_v) = objectName(); break;
119         }
120         _id -= 1;
121     } else if (_c == QMetaObject::WriteProperty) {
122         void *_v = _a[0];
123         switch (_id) {
124         case 0: setObjectName(*reinterpret_cast< QString*>(_v)); break;
125         }
126         _id -= 1;
127     } else if (_c == QMetaObject::ResetProperty) {
128         _id -= 1;
129     } else if (_c == QMetaObject::QueryPropertyDesignable) {
130         _id -= 1;
131     } else if (_c == QMetaObject::QueryPropertyScriptable) {
132         _id -= 1;
133     } else if (_c == QMetaObject::QueryPropertyStored) {
134         _id -= 1;
135     } else if (_c == QMetaObject::QueryPropertyEditable) {
136         _id -= 1;
137     } else if (_c == QMetaObject::QueryPropertyUser) {
138         _id -= 1;
139     }
140 #endif // QT_NO_PROPERTIES
141     return _id;
142 }
143 
144 // SIGNAL 0
145 void QObject::destroyed(QObject * _t1)
146 {
147     void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
148     QMetaObject::activate(this, &staticMetaObject, 0, _a);
149 }
150 QT_END_MOC_NAMESPACE

仅供参考,做一些深层次的分析
原文链接: https://www.cnblogs.com/lfsblack/p/5319437.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/230889

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午2:49
下一篇 2023年2月13日 下午2:49

相关推荐