2017-02-18 29 views
3

У меня есть список ошибок в C++, и я хочу показать его в QML. Enum регистрируется с использованием Q_ENUM, а имущество регистрируется с использованием Q_PROPERTY. Вы можете увидеть подробности ниже:Как вывести Qlist из перечислений с 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; 
}; 

и я зарегистрировал MyClass используя следующую строку в main.cpp:

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 documentation, QList поддерживается только для ограниченного набора типов (int, qreal, и так далее). Дополнительную информацию см. В разделе Тип последовательности для массива JavaScript.
Вы должны использовать QVariantList для своих целей. Он непосредственно сопоставляется с JavaScript Array. Дополнительную информацию см. В разделе QVariantList и QVariantMap для JavaScript-массива и объекта.
Отметим также явное упоминание:

Другие типы последовательностей не поддерживаются прозрачно, и вместо того, чтобы экземпляр любого другого типа последовательности будут передаваться между QML и C++ в качестве непрозрачного QVariantList.

Конечно, вы все еще можете использовать QList<LoginErrorCode> внутренне, но преобразование в QVariantList требуется всякий раз, когда вы хотите, чтобы вернуть его в среде QML.

+0

Это хорошо работает, спасибо. Как указано в документации, следует избегать варианта, когда это возможно. Итак, есть ли у вас какой-либо другой альтернативный способ опубликовать список перечислений в QML? –

+0

@ S.M.Mousavi Когда это возможно. В вашем случае вы можете просто пойти с 'QVariantList'. В противном случае вы можете использовать, вероятно, 'QList ' и легко конвертировать назад и вперед ваши значения перечисления. Если вы дадите ему шанс, дайте мне знать, если это сработает, и я буду интегрировать ответ с этим комментарием. ;-) – skypjack

 Смежные вопросы

  • Нет связанных вопросов^_^