Использование QList<QObjectDerived*> как модель

221
23 марта 2017, 21:50

Есть класс, производный от QObject.

class MyClass : public QObject
{
    Q_PROPERTY(int a READ...)
}

Если объекты этого класса складывать в список QList<QObject*>, то они подхватываются в QML и отображаются в ListView. А если использовать QList<MyClass*>, то ListView оказывается пустым. Но хотелось бы в c++-коде использовать именно QList<MyClass*>, а лучше QList<QSharedPointer<MyClass>>, так как в противном случае придётся использовать восходящее приведение типов, что может привести к ошибкам. Какие есть способы такое провернуть?

Answer 1

Унаследуйтесь от QAbstractListModel, реализуйте методы data, сount и roles и т.д этого класса и наследник засуньте в макрос QML_DECLARE_TYPE()

Итого сможете использовать в QML как объект

class MyModel: public QAbstractListModel
{
    Q_OBJECT
public:
       QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
       int rowCount(const QModelIndex &parent) const;
       QHash<int,QByteArray> roleNames() const;
   private:
       QList<MyCustomClass*> mList;
};
QML_DECLARE_TYPE(MyModel)
READ ALSO
Не могу решить задачку. Операторы ввода/вывода, Параметры вывода

Не могу решить задачку. Операторы ввода/вывода, Параметры вывода

Подскажите, что не такПо условию вроде правильно, насколько я понял, но проверку не проходит

326
Как считывать структуру из файла?

Как считывать структуру из файла?

Допустим, у меня есть структура

190
Проблемы с IPv6 при создании соединения

Проблемы с IPv6 при создании соединения

Проблема заключается в следующем: написал общую ф-ию initNetAddressFromEndpoint которая по IP адресу (IPv4, IPv6, доменное имя) и порту отдает нам структуру...

245
Как переделать код, чтобы не вызывать функцию inline.

Как переделать код, чтобы не вызывать функцию inline.

Есть код, который нужно переделать, но пока не силен в jsСейчас код вызывается inline через onclick, а мне нужно, чтобы он вызывался непосредственно...

171