如果在宏中使用,qmlRegisterType模板将失败

时间:2014-10-15 14:23:22

标签: c++ qt qml c-preprocessor

我目前正在使用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运行时无法注册类型,因为宏&#34; 看起来不像是一个类型注册&#34;

我使用Qt Creator(3.1.2)基于Qt 5.3.1(MSVC 2010,32位)

1 个答案:

答案 0 :(得分:0)

经过几周的放弃,我发现了什么问题。

宏是正确的,使用宏的代码也是正确的。

问题是Component1的大小写,它在名为component1的qml文件上使用(首字母小写)。

因此,当代码使用类型Component1时,宏正在发布类型component1 ...这是一个愚蠢的问题。