我目前正在使用Qt和qml文件;我使用的许多qml源都利用了使用qmlRegisterType
模板将C ++类发布到qml运行时的强大功能:
int main(int argc, char *argv[])
{
QApplication application(argc,args);
qmlRegisterType<Component1>("CompanyName", 1, 0, "Component1");
qmlRegisterType<Component2>("CompanyName", 1, 0, "Component2");
...
lots of components
...
qmlRegisterType<ComponentN>("CompanyName", 1, 0, "ComponentN");
return application.exec();
}
在qml上注册的C ++类型的数量非常多,并且注册很麻烦,所以我决定将注册放入一个宏,因为许多数据都是在所有的数据上重复的。注册过程,宏看起来如下:
#define QMLTYPE(T) qmlRegisterType<T>("CompanyName", 1, 0, #T);
您可以猜测它是如何使用的:
int main(int argc, char *argv[])
{
QApplication application(argc,args);
QMLTYPE(Component1);
QMLTYPE(Component2);
...
lots of components
...
QMLTYPE(ComponentN);
return application.exec();
}
扩展此宏后,AFAIK代码应该看起来像第一个在此问题上发布的代码,因此,功能应该保持不变。但是在启动程序的宏版本后,会出现错误:
Component1不是类型
似乎qml运行时无法找到已注册的类型,就好像宏失败或阻止Qt voodoo发布类型一样。恢复到无宏版本,应用程序运行没有错误。我发誓,两个版本之间的唯一区别是使用宏来调用qmlRegisterType
模板函数。
在解释问题之后,让我问一对问题:
QMLTYPE(T)
宏是否正确,或者我在输入该宏时犯了一些错误。我使用Qt Creator(3.1.2)基于Qt 5.3.1(MSVC 2010,32位)
答案 0 :(得分:0)
经过几周的放弃,我发现了什么问题。
宏是正确的,使用宏的代码也是正确的。
问题是Component1
的大小写,它在名为component1
的qml文件上使用(首字母小写)。
因此,当代码使用类型Component1
时,宏正在发布类型component1
...这是一个愚蠢的问题。