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

标签 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();
}

据我所知,在扩展这个宏之后,代码应该看起来像这个问题上的第一个帖子,所以功能应该保持不变。但是启动程序的宏版本后,出现错误:

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/

相关文章:

c++ - OpenCL - OpenGL - Interop:如何填充 cl::ImageGL

c++ - 导出类时编译器错误

c++ - ASIO 中存在单独的接受器类背后的设计原理

qt - 使用 CMAKE 安装 opencv 3.4.1 和 Qt 5.10

qt - 在 QtQuick 中停靠

python - PyQt5动态添加矩形到QML网格

c++ - vector 指针的删除条目静态映射c++

c++ - 我可以通过 QtService 编写(Windows 或 Linux)服务吗?

c++ - 将 QFile 内容复制到另一个 QFile,最佳方法是什么?

c++ - 如何将 qml 子组件信号连接到 C++ 插槽