我有一个c ++中的错误列表,我想将它暴露给QML。枚举使用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;
};
注册。您可以在下面看到详细信息:
MyClass
我使用main.cpp
中的以下行注册了qmlRegisterType<MyClass>("ir.MyComponents", 1, 0, "MyClass");
:
MyClass {
id: myClass
Component.onCompleted: login("irani", "iravani");
onLoginFailed: console.log("Login failed with errors count: "+loginErrors.length);
}
在QML中我使用该类:
QMetaProperty::read: Unable to handle unregistered datatype 'QList<LoginErrorCode>' for property 'MyClass::loginErrors'
qrc:/main.qml:46: TypeError: Cannot read property 'length' of undefined
,输出为:
QQmlListProperty
有什么问题?!
如何将我的枚举列表公开给qml?
对于{{1}}文档说:
注意:QQmlListProperty只能用于QObject派生的列表 对象指针。
答案 0 :(得分:4)
正如您所看到的here,QList
仅支持一组有限的类型(int
,qreal
等)。有关详细信息,请参阅序列类型到JavaScript数组部分
您应该使用QVariantList
代替您的目的。它直接映射到JavaScript Array
。有关详细信息,请参阅 QVariantList和QVariantMap到JavaScript数组和对象部分。
另请注意明确提及:
其他序列类型不是透明支持的,而是任何其他序列类型的实例将作为不透明的QVariantList在QML和C ++之间传递。
当然,您仍然可以在内部使用QList<LoginErrorCode>
,但只要您想在QML环境中退回,就需要转换为QVariantList
。