在Qt中,想要使用signal/slot来传递自定义的类型时,需要使用qRegisterMetaType来注册。其原因是:当一个signal被放到队列中(queued)时,它的参数(arguments)也会被一起一起放到队列中(queued起来),这就意味着参数在被传送到slot之前需要被拷贝、存储在队列中(queue)中;为了能够在队列中存储这些参数(argument),Qt需要去construct、destruct、copy这些对象。用qRegisterMetaType对自定义的类型进行注册,就是为了告诉Qt如何去做这些事情。
步骤:(以自定义MyDataType类型为例)
1、自定MyDataType 类型,在这个类型的顶部包含:#include <QMetaType>
2、在类型定义完成后,加入声明:Q_DECLARE_METATYPE(MyDataType);
3、在main()函数中注册这种类型:qRegisterMetaType<MyDataType>("MyDataType");
4、如果还希望使用这种类型的引用,可同样要注册:qRegisterMetaType<MyDataType>("MyDataType&");
例:
#include <QMetaType>
class MyDataType
{
public:
MyDataType();
MyDataType(int, double);
private:
};
Q_DECLARE_METATYPE(MyDataType);
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
qRegisterMetaType<MyDataType>("MyDataType");
qRegisterMetaType<MyDataType>("MyDataType&");
}