2017-02-18 44 views
3

我有一個C++中的錯誤列表,我想將它公開給QML。 Enum使用Q_ENUM註冊,並使用Q_PROPERTY註冊。你可以看到下面的詳細信息:如何將C++中的枚舉從C++公開到QML?

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 

什麼問題?
如何將我的枚舉列表公開給qml?

對於QQmlListProperty文件說:

注:QQmlListProperty只能用於QObject的衍生 對象指針列表。

回答

4

正如你可以看到from the documentationQList只支持一組有限的類型(intqreal,等等)。有關更多詳細信息,請參見部分序列類型到JavaScript數組
您應該使用QVariantList來代替您的目的。它直接映射到JavaScript Array。有關更多詳細信息,請參見QVariantList和QVariantMap to JavaScript Array和Object
還要注意明確提到:

其他序列類型不支持透明的,而是任何其他序列類型的實例將QML和C++爲不透明QVariantList之間傳遞。

當然,你仍然可以使用一個內部QList<LoginErrorCode>,但需要到QVariantList轉換,只要你想在QML環境中返回。

+0

這個效果很好,謝謝。正如文件中所建議的,儘可能避免變體。那麼你有沒有其他替代方法將枚舉列表公開給QML? –

+0

@ S.M.Mousavi如有可能。就你而言,你可以使用'QVariantList'。否則,您可以使用'QList '並輕鬆地將您的枚舉值來回轉換。如果你給它一個機會,讓我知道它是否有效,我將整個答案與這個評論。 ;-) – skypjack