我在c中有一个错误列表,我想将它暴露给QML . 枚举使用 Q_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;
};
我在 main.cpp
中使用以下行注册了 MyClass
:
qmlRegisterType<MyClass>("ir.MyComponents", 1, 0, "MyClass");
在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
What is the problem?! How can I expose my list of enums to qml?
对于 QQmlListProperty
文档说:
注意:QQmlListProperty只能用于QObject派生的对象指针列表 .
1 回答
如您所见from the documentation,仅支持一组有限类型的
QList
(int
,qreal
等) . 有关更多详细信息,请参阅序列类型到JavaScript数组 .您应该使用
QVariantList
代替 . 它直接映射到JavaScriptArray
. 有关更多详细信息,请参阅QVariantList和QVariantMap到JavaScript Array和Object部分 .还要注意明确提到:
当然,您仍然可以在内部使用
QList<LoginErrorCode>
,但只要您想在QML环境中返回它,就需要转换为QVariantList
.