我目前正在使用 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();
}
据我所知,在扩展这个宏之后,代码应该看起来像这个问题上的第一个帖子,所以功能应该保持不变。但是启动程序的宏版本后,出现错误:
Component1 is not a type
似乎 qml 运行时无法找到注册的类型,好像宏失败或阻止 Qt voodoo 发布类型。恢复到无宏版本,应用程序运行无误。我发誓这两个版本之间的唯一区别是使用宏来调用 qmlRegisterType
模板函数。
在解释完问题后,让我提出一对问题:
QMLTYPE(T)
宏是否正确,或者我在键入该宏时犯了某种错误。- 如果宏不是问题并且扩展为预期代码,Qt 运行时是否无法注册类型,因为宏“看起来不像是类型注册”?
我正在使用基于 Qt 5.3.1(MSVC 2010,32 位)的 Qt Creator (3.1.2)
最佳答案
在放弃这个问题数周后,我发现了问题所在。
宏是正确的,使用宏的代码也是正确的。
问题是 Component1
的大写,它用在名为 component1
的 qml 文件上(首字母小写)。
所以宏正在发布类型 Component1
而代码正在使用类型 component1
...这是一个愚蠢的问题。
关于c++ - 如果在宏中使用,qmlRegisterType 模板将失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26384974/