C++的RTTI提供运行时的类型信息,QT使用元对象来提供更加强大的内省功能,能在运行时获取对象的属性和方法。
Qt 的信号看起来像是一个只有声明没有定义的函数,在信号发射时,会发生拷贝过程;如果信号有和槽函数绑定,那么信号的参数再传递给槽函数,又会发生一个拷贝过程。
class Myclass
{
public:
Myclass()
{
qDebug() <<"default!";
}
Myclass(const Myclass& other)
{
qDebug() << "copy costructor!";
}
Myclass& operator= (const Myclass& other)
{
qDebug() << "assign costurctor!";
return *this;
}
void func()
{
qDebug() << "hello world!";
}
};
如果信号和槽函数的参数类型都是Myclass类型,emit 信号之后,会发生两次拷贝的过程。
如果信号和槽函数的类型一个是引用,一个是非引用时,connect 的时候会发生类型不匹配的错误:
信号和槽函数的类型可以同时为引用类型,此时可以减少传递过程中拷贝的开销。
对于跨线程的信号槽链接,信号和槽函数的类型必须为元类型,对于自定义的类型,需要注册为元类型:
qRegisterMetaType<Myclass>("Myclass");