QML SectionScroller и QList‹QObject*›

Я использую QList<QObject*> в качестве модели в своем приложении. Поскольку элементов может быть много, я решил использовать SectionScroller. Когда я пытаюсь прокрутить с помощью SectionScroller, я получаю

Error: Unable to assign [undefined] to QString

Что я делаю неправильно?

Мой ListView:

ListView
{
    id: irrview
    width: parent.width
    model: irregulars.db // QList<QObject*>
    anchors.top: caption.bottom
    anchors.bottom: parent.bottom
    clip: true
    section.criteria: ViewSection.FirstCharacter
    section.property: "form0"
    section.delegate: Item {height: 10; width: parent.width; Text { text: section } } // for testing purposes
    delegate: Rectangle
    {
        /**/
    }
}

Спасибо

РЕДАКТИРОВАТЬ: больше кода:

заголовок irregulars

class IrregularListWrapper : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QList<QObject*> db READ getdb NOTIFY langChanged)
    Q_ENUMS(Language)
public:
    enum Language
    {
        English = 0,
        German = 1
    };

    IrregularListWrapper() : db(0) { setLang(German); }
    ~IrregularListWrapper() { delete db; }
    QList<QObject*> getdb() const { return *db; }

    Q_INVOKABLE void changeLang(Language l) { delete db; setLang(l); }


signals:
    void langChanged();
protected:
    void setLang(Language);
    QList<QObject*> * db;
};

и тело функции

void IrregularListWrapper::setLang(Language l)
{
    switch (l)
    {
    case English:
        db = new english;
        langName = "English";
        break;
    case German:
        db = new german;
        langName = "German";
        break;
    }
    emit langChanged();
}

уроки немецкого, английского такие

class german : public QList<QObject*>
{
public:
    german();
};

german::german()
{
    append(new IrregularVerb("anfangen", "fing an", "angefangen"));
    /*more like that*/
}

и неправильный глагол:

class IrregularVerb : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString form0 READ getForm0 NOTIFY formChanged)
    Q_PROPERTY(QString form1 READ getForm1 NOTIFY formChanged)
    Q_PROPERTY(QString form2 READ getForm2 NOTIFY formChanged)
public:
    QString forms[3];
    QString getForm0() const { return getForm(0); }
    QString getForm1() const { return getForm(1); }
    QString getForm2() const { return getForm(2); }
    IrregularVerb(QString a, QString b, QString c) { forms[0] = a; forms[1] = b; forms[2] = c; }
protected:
    const QString& getForm(const int& ind) const { return forms[ind]; }
signals:
    void formChanged();

};

Редактировать 2: это не работает. Если я это сделаю

QVariantList getdb() const { return QVariant::fromValue(*db); }

IrregularListWrapper.h:24: error: could not convert 'QVariant::fromValue(const T&) [with T = QList<QObject*>; QVariant = QVariant]()' from 'QVariant' to 'QVariantList {aka QList<QVariant>}'

Если снять звезду, то ошибка аналогичная.

РЕДАКТИРОВАТЬ3:

Я обнаружил это http://ruedigergad.com/2011/08/22/qml-sectionscroller-vs-qabstractlistmodel/

И узнал, что irregulars.db.get не определено

И изменил немецкий и английский на

class german : public AbstractIrregularList

а также

class AbstractIrregularList : public QObject, public QList<QObject*>
{
    Q_OBJECT
public:
    Q_INVOKABLE QObject* get(int index) {return at(index);}
};

Но даже сейчас нерегулярный.db.get(0) выдает ошибку (Результат выражения 'irregulars.db.get' [undefined] не является функцией.)

Почему так происходит, что Q_INVOKABLE не определяется? Макрос Q_OBJECT есть

/edit5: Даже при использовании QVariant ошибки остаются. Его можно рассматривать как QList или как QObject*.


person marmistrz    schedule 31.01.2013    source источник


Ответы (1)


Если я не ошибаюсь, вы должны использовать QVariantList вместо QList‹SomeClass›, чтобы выставить список элементов из C++ в QML.

Это должно решить проблему.


Поддерживаемые типы в QML


Попробуйте сделать такой код (в заголовке irregulars):

Q_PROPERTY(QVariantList db READ getdb NOTIFY langChanged)
//...
QVariantList getdb() const {/*convert db to QVariantList*/ return converted_db;}

Или, если вы хотите, чтобы код выглядел как ссылки, которые вы дали:

Q_PROPERTY(QVariantList db READ getdb NOTIFY langChanged)
//...
QVariant getdb() const {return QVariant::fromValue(db);}
person DRAX    schedule 31.01.2013
comment
Насколько мне известно, QList‹QObject*› ​​можно использовать harmattan-dev.nokia.com/docs/platform-api-reference/xml/ — я даже использовал его в другом приложении - person marmistrz; 31.01.2013
comment
Взгляните на код, он преобразован в QVariant::fromValue(dataList) для того, чтобы его можно было раскрыть, также ссылка в моем посте показывает, что вы поддерживаете типы в QML, а QList не указан. - person DRAX; 31.01.2013
comment
Странно, так как содержимое QList‹QObject*› ​​отображается нормально. Не работает только SectionScroller. Добавлен код РЕДАКТИРОВАТЬ: он есть даже в примерах: doc.qt.digia.com/4.7-snapshot/ - person marmistrz; 31.01.2013
comment
Я подозреваю, что это потому, что ctxt-›setContextProperty принимает QVariant в качестве аргумента. все же попробую - person marmistrz; 31.01.2013
comment
Подождите, может быть, я нашел проблему. Обновлю пост. (но мне все еще любопытно, как QList работает для вас в QML) - person DRAX; 31.01.2013
comment
Держу пари, это не проблема. Это всего лишь метка, указывающая на то, что раздел запущен, и это отображается нормально ... Возможно, я нашел проблему, я обновлю завтра CET. - person marmistrz; 01.02.2013
comment
У меня нет другой идеи, кроме того, что QList не распознается QML. Поскольку вы расширяете QList в своем классе AbstractIrregularList, можете ли вы получить доступ к таким методам, как at()? - person DRAX; 02.02.2013
comment
Кроме того, я только что понял, что вы определили такую ​​функцию: QVariantList getdb() const { return QVariant::fromValue(*db); }, но должно быть так: QVariant getdb() const { return QVariant::fromValue(*db); }. Вы не можете присвоить QVariant QVariantList. - person DRAX; 02.02.2013
comment
Но этот тип данных обнаруживается, и его содержимое отображается. Проблема только в том. РазделСкроллер. Я обнаружил в коде SectionScroller, что есть вызов list.model.get... Этот метод можно добавить через QAbstractListModel, но я бы счел это излишним. Попробую QVariant, может получится! Кстати. ЕСЛИ вы не верите, что qlist qobject* можно использовать, почему бы вам не попробовать? :) Я использую Qt 4.7 - person marmistrz; 02.02.2013
comment
Извините, на данный момент у меня есть только Qt5... Однако около 6 месяцев назад я делал приложение для Nokia N9, и, если я хорошо помню, у меня были проблемы с QMap и QList (не удалось открыть QML), поэтому я пришлось преобразовать их в QVariantList. - person DRAX; 03.02.2013