如何从C++;到QML? 我有一个C++错误列表,我想把它暴露给QML。使用Q_Enum注册Enum,使用Q_property注册属性。您可以看到以下详细信息: class MyClass : public QObject { Q_OBJECT Q_PROPERTY(QList<LoginErrorCode> loginErrors READ getLoginErrors NOTIFY loginErrorsChanged) ... public: ... enum LoginErrorCode { UsernameOrPassIsNotValid }; Q_ENUM(LoginErrorCode) enum GetUserInfoErrorCode { GetUserInfoError_TokenIsNotValid }; Q_ENUM(GetUserInfoErrorCode) QList<LoginErrorCode> getLoginErrors() const; ... signals: ... void loginFailed(); ... void loginErrorsChanged(); ... private: QList<LoginErrorCode> m_loginErrors; };

如何从C++;到QML? 我有一个C++错误列表,我想把它暴露给QML。使用Q_Enum注册Enum,使用Q_property注册属性。您可以看到以下详细信息: class MyClass : public QObject { Q_OBJECT Q_PROPERTY(QList<LoginErrorCode> loginErrors READ getLoginErrors NOTIFY loginErrorsChanged) ... public: ... enum LoginErrorCode { UsernameOrPassIsNotValid }; Q_ENUM(LoginErrorCode) enum GetUserInfoErrorCode { GetUserInfoError_TokenIsNotValid }; Q_ENUM(GetUserInfoErrorCode) QList<LoginErrorCode> getLoginErrors() const; ... signals: ... void loginFailed(); ... void loginErrorsChanged(); ... private: QList<LoginErrorCode> m_loginErrors; };,c++,qt,enums,qml,qqmllistproperty,C++,Qt,Enums,Qml,Qqmllistproperty,在QML中,我使用该类使用: MyClass { id: myClass Component.onCompleted: login("irani", "iravani"); onLoginFailed: console.log("Login failed with errors count: "+loginErrors.length); } 输出为: QMetaProperty::read: Unable to handle unregistered datatype

在QML中,我使用该类使用:

MyClass {
    id: myClass
    Component.onCompleted: login("irani", "iravani");
    onLoginFailed: console.log("Login failed with errors count: "+loginErrors.length);
}
输出为:

QMetaProperty::read: Unable to handle unregistered datatype 'QList<LoginErrorCode>' for property 'MyClass::loginErrors'
qrc:/main.qml:46: TypeError: Cannot read property 'length' of undefined
QMetaProperty::read:无法处理属性“MyClass::loginErrors”的未注册数据类型“QList”
qrc:/main.qml:46:TypeError:无法读取未定义的属性“length”
有什么问题
如何向qml公开我的枚举列表?

对于
qqmlistproperty
文档说明:

注意:QQmlListProperty只能用于QObject派生的列表 对象指针

如您所见,
QList
仅支持有限的一组类型(
int
qreal
,等等)。有关更多详细信息,请参阅JavaScript数组的序列类型部分。
您应该使用
QVariantList
来代替。它直接映射到JavaScript
数组
。有关更多详细信息,请参阅QVariantList和QVariantMap到JavaScript数组和对象部分。
还请注意明确提到:

其他序列类型不支持透明,相反,任何其他序列类型的实例将在QML和C++之间传递为不透明qqValangList.


当然,您仍然可以在内部使用
QList
,但是只要您想在QML环境中返回它,就需要将其转换为
QVariantList

这很有效,谢谢。正如文件中所建议的,应尽可能避免使用变体。所以,如果可能的话,您是否有其他方法向QML?@S.M.Mousavi公开枚举列表。在您的情况下,只需使用
QVariantList
。否则,您可能可以使用
QList
,轻松地来回转换枚举值。如果你给我一个机会,让我知道它是否有效,我会将答案与此评论结合起来。;-)
QMetaProperty::read: Unable to handle unregistered datatype 'QList<LoginErrorCode>' for property 'MyClass::loginErrors'
qrc:/main.qml:46: TypeError: Cannot read property 'length' of undefined