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

qmlRegisterType template fails if used in macro

本文关键字:模板 失败 qmlRegisterType 如果      更新时间:2023-10-16

我目前正在处理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在扩展这个宏之后,代码应该看起来像这个问题上第一次发布的代码,所以功能应该保持不变。但在启动该程序的宏版本后,出现了一个错误:

组件1不是类型

qml运行时似乎找不到注册的类型,就好像宏失败或阻止Qt voodoo发布类型一样。恢复到无宏版本,应用程序运行时不会出现错误。我发誓,这两个版本之间的唯一区别是使用宏来调用qmlRegisterType模板函数。

解释完问题后,让我问两个问题:

  • QMLTYPE(T)宏是否正确,或者我在键入该宏时出现了某种错误
  • 如果宏不是问题所在,并且它扩展到预期的代码,Qt运行时是否因为宏"看起来不像是注册的类型"而无法注册类型

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

经过数周的放弃,我发现了问题所在。

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

问题在于名称为component1(第一个字母小写)的qml文件中使用的Component1的大小写。

所以宏发布类型Component1,而代码使用类型component1。。。这是个愚蠢的问题。