1、熟悉java、c#等高级语言的都知道其语言有反射机制非常方便,而qt也有类似的机制,其主要是依赖于QMetaObject元对象系统,本次将从源码着手一探究竟。
2、由于QMetaObject源码比较庞大,且依赖很多其他的类,所以先看下依赖中的类实现
3、QGenericArgument的源码:
QGenericArgument的实现还是比较简单的,其主要是保存参数的名称及对应的值,包括一系列的子类,只是简单的讲参数名称和值保存下来;
比较重要的是一些宏的定义:
a、首先看下qFlagLocation方法的实现:
此函数主要是判断是否需要存储对应的方法,猜测是线程中的类对象是否存储
qFlagLocation("1"#a QLOCATION),#的作用是把a当成符号,把#后面的看作字符串,例如:
#define toString(a) #a
void main() {
qDebug()<<toString(Hello);
}
将输出“Hello"字符串
此处定义了类成员变量的类型,应该是在生成Moc文件时会用到;
4、内部类Connection的实现:
主要看一下bool isconnected_helper()函数的实现:
此函数主要是用来判断信号与槽是否已经链接,通过源码可以看到,其判断会转移到QObjectPrivate::Connection类中;loadRelaxed确保线程间操作是原子性的;