如果在宏中使用qmlRegisterType模板,则会失败
qmlRegisterType template fails if used in macro
我目前正在处理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
。。。这是个愚蠢的问题。
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- variadic模板中的模板参数推导失败
- 当给定默认值时,为什么此模板参数推导失败
- 模板参数推导失败,函数参数/参数不匹配
- 包含模板文件的递归会导致编译失败
- 使用模板化运算符重载 XOR 运算符失败
- 为什么模板参数推导失败?
- 模板参数的 C++ 自动模板推导失败
- 调试模板时出现问题.专门针对 Linux GCC 7、GCC 6、GCC 5、GCC 4.9 错误构建失败:模板参数 1
- 我的C++模板失败:非模板结构的显式专用化
- 使用函数指针作为参数匹配模板失败
- 在DirectX11中创建深度模板失败
- 使用std::函数替换模板失败
- 使用Lambda函数转换模板失败
- 在线程中特化函数模板失败
- c++错误C2893:特化函数模板失败
- 试图在c++中实现一个堆栈模板(失败得很惨)
- 使用基于范围的for()编译Slice模板失败