如何将枚举的 Qlist 从 C++ 公开到 QML?
How to expose a Qlist of enums from C++ to QML?
我有一个 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 中我使用 class 使用:
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
有什么问题吗?!
如何将我的枚举列表公开给 qml?
对于 QQmlListProperty
文档说:
Note: QQmlListProperty can only be used for lists of QObject-derived
object pointers.
如您所见,from the documentation、QList
仅支持一组有限的类型(int
、qreal
,等等)。有关详细信息,请参阅 序列类型到 JavaScript 数组 部分。
您应该使用 QVariantList
来代替。它直接映射到JavaScript Array
。有关详细信息,请参阅 QVariantList 和 QVariantMap 到 JavaScript 数组和对象 部分。
另请注意明确提及:
Other sequence types are not supported transparently, and instead an instance of any other sequence type will be passed between QML and C++ as an opaque QVariantList.
当然,您仍然可以在内部使用 QList<LoginErrorCode>
,但是只要您想在 QML 环境中 return 就需要转换为 QVariantList
。
我有一个 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 中我使用 class 使用:
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
有什么问题吗?!
如何将我的枚举列表公开给 qml?
对于 QQmlListProperty
文档说:
Note: QQmlListProperty can only be used for lists of QObject-derived object pointers.
如您所见,from the documentation、QList
仅支持一组有限的类型(int
、qreal
,等等)。有关详细信息,请参阅 序列类型到 JavaScript 数组 部分。
您应该使用 QVariantList
来代替。它直接映射到JavaScript Array
。有关详细信息,请参阅 QVariantList 和 QVariantMap 到 JavaScript 数组和对象 部分。
另请注意明确提及:
Other sequence types are not supported transparently, and instead an instance of any other sequence type will be passed between QML and C++ as an opaque QVariantList.
当然,您仍然可以在内部使用 QList<LoginErrorCode>
,但是只要您想在 QML 环境中 return 就需要转换为 QVariantList
。