gpt4 book ai didi

c++ - 将 qmlRegisterType 与 Q_ENUM 和 typedef 枚举一起使用

转载 作者:行者123 更新时间:2023-11-30 05:22:06 27 4
gpt4 key购买 nike

我想在我的 QML 文件中使用来自另一个 header 的枚举。用 Q_ENUM 包装后,我无法让它与 qmlRegisterType 一起工作:

class Test: public QObject
{
Q_OBJECT

typedef foo::bar Foobar; // bar is the enum, contained in a namespace foo

Q_ENUM(Foobar)

public:
static void declareQML()
{
qmlRegisterType<Foobar>("TestEnums", 1, 0, "Foobar");
};
}

使用 MSVC 2013 时,出现以下错误:

C:\Qt\5.7\msvc2013\include\QtQml\qqml.h:244: error: C2838: 'staticMetaObject' : illegal qualified name in member declaration

see reference to function template instantiation 'int qmlRegisterType<Test::Foobar>(const char *,int,int,const char *)' being compiled

是因为枚举包含在命名空间中吗?请注意,我无法修改包含命名空间和枚举(由 protobuf 生成)的文件。

最佳答案

qmlRegisterType() 将注册一个用于 QML 的类型,但那将是一个 QObject 派生类型,而不是一个枚举。所以你实际上需要注册 Test,枚举应该由 Q_ENUM 宏处理。

枚举必须是 QObject 派生类的一部分,以便 Qt 元系统可以处理它。我认为它不适用于某些外部枚举。

如果枚举在常规类中,您可以将其设为Q_GADGET 让 moc 处理它,否则您可以在 Test 的主体中复制原始枚举>.

最后,枚举名称和值必须以大写字母开头才能在 QML 中使用。

关于c++ - 将 qmlRegisterType 与 Q_ENUM 和 typedef 枚举一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39836445/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com