QMetaObject分析
2015-06-02 19:06
585 查看
Q_OBJECT 宏
在QObject子类中,包含Q_OBJECT宏可以使用Qt的信号槽特性。
QMetaObject 属性
QMetaObject 函数
// 未完待续。。。
在QObject子类中,包含Q_OBJECT宏可以使用Qt的信号槽特性。
class showObject : public QObject { Q_OBJECT .... }
宏展开后会出现: const QMetaObject showObject::staticMetaObject; // 每一个QObject派生的子类都包含有一个静态的QMetaObject对象 private: Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
QMetaObject 属性
struct { // private data const QMetaObject *superdata; const QByteArrayData *stringdata; const uint *data; typedef void (*StaticMetacallFunction)(QObject *, QMetaObject::Call, int, void **); StaticMetacallFunction static_metacall; // (核心)指向子类函数showObject::qt_static_metacall const QMetaObject **relatedMetaObjects; void *extradata; //reserved for future use } d;
QMetaObject 函数
/* \since 4.5 Constructs a new instance of this class. You can pass up to ten arguments (\a val0, \a val1, \a val2, \a val3, \a val4, \a val5, \a val6, \a val7, \a val8, and \a val9) to the constructor. Returns the new object, or 0 if no suitable constructor is available. Note that only constructors that are declared with the Q_INVOKABLE modifier are made available through the meta-object system. \sa Q_ARG(), constructor() */ QObject *QMetaObject::newInstance(QGenericArgument val0, QGenericArgument val1, QGenericArgument val2, QGenericArgument val3, QGenericArgument val4, QGenericArgument val5, QGenericArgument val6, QGenericArgument val7, QGenericArgument val8, QGenericArgument val9) const
此方法在showObject 子类的构造函数使用/* Q_INVOKABLE */宏修饰的时候有效 public: Q_INVOKABLE explicit showObject(QObject *parent = 0); 使用: const QMetaObject *meta = &showObject::staticMetaObject; QObject *o = meta->newInstance(); delete o;
原理: QMetaObject::newInstance { ..... QObject *returnValue = 0; // returnValue 传入param void *param[] = {&returnValue, val0.data(),... val9.data()}; // 关键在这里 QMetaObject::static_metacall(CreateInstance, idx, param) return returnValue; } int QMetaObject::static_metacall(Call cl, int idx, void **argv) const { // 这里又调用 d.static_metacall(0, cl, idx, argv);// 指向 showObject::qt_static_metacall } // 最终实现之地,终于找到了 showObject::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) { if (_c == QMetaObject::CreateInstance) { switch (_id) { // 终于找到 new 了,从此多了一种动态创建showObject的方法,就是使用 QMetaObject::newInstance case 0: { showObject *_r = new showObject((*reinterpret_cast< QObject*(*)>(_a[1]))); if (_a[0]) *reinterpret_cast<QObject**>(_a[0]) = _r; } break; case 1: { showObject *_r = new showObject(); if (_a[0]) *reinterpret_cast<QObject**>(_a[0]) = _r; } break; } } }
// 未完待续。。。
相关文章推荐
- ELF relocatable object file && ELF Executable object file && Run-time Memory Image 的结构
- Objective-C编码规范:26个方面解决iOS开发问题
- XPCOM (Cross Platform Component Object Model)
- Objective-C编码规范
- birt报表报错, There is no report design object available.org.eclipse.birt.report.exception.ViewerExcepti
- [iOS] performSelector:withObject:afterDelay:调用没有作用的问题及解决方法
- Objective-C 编码规范
- @synchronized (object)使用详解
- 为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权
- Objective-c 字面量
- android 详细解答json解析与生成 JSONObject JSONArray
- swfobject.embedSWF与div的z-index问题
- SWFObject: 基于Javascript的Flash媒体版本检测与嵌入模块
- objective-C 的内存管理之-自动释放池(autorelease pool)
- ObjectInputStream\ObjectOutputStream用字节流将一个Object对象持久化和读取
- 黑马程序员_ Objective C 封装,继承,多态总结
- Objective-C的内存管理机制(非ARC)
- iOS(Objective-C语法)面试、笔试题目
- 线程函数的设计以及MsgWaitForMultipleObjects函数的使用要点
- iOS中Objective-C与JavaScript之间相互调用的实现(实现了与Android相同的机制)