Я выяснил, как представить и связать экземпляр производной модели списка QAbstractListModel с / в QML.
Но то, что я действительно хочу сделать, это представить объект в QML и связать член, который является производной моделью списка QAbstractListModel, как Q_PROPERTY.
Я попробовал это так:
class MyObject : public QObject
{
Q_OBJECT
Q_PROPERTY(MyListModel myListModel READ myListModel NOTIFY myListModelChanged)
public:
explicit MyObject(QObject *parent = 0);
MyListModel *myListModel();
signals:
void myListModelChanged();
public slots:
private:
MyListModel *m_myListModel;
};MyObject::MyObject(QObject *parent) :
QObject(parent)
{
m_myListModel = new MyListModel(this);
}
MyListModel *MyObject::myListModel()
{
return m_myListModel;
}
class MyListModel : public QAbstractListModel {
Q_OBJECT
//...
//...
}
int main(int argc, char *argv[])
{
QGuiApplication a(argc, argv);
QQuickView *view = new QQuickView();
MyObject *myObject = new MyObject();
view->engine()->rootContext()->setContextProperty("myObject", myObject);
view->setSource(QUrl::fromLocalFile("main.qml"));
view->show();
return a.exec();
}
Rectangle {
width: 200
height: 200
//...
//...
ListView {
id: myListView
anchors.fill: parent
delegate: myDelegate
model: myObject.myListModel
}
}
Но я получаю ошибку компиляции:
E: \ Qt \ Qt5 \ 5.1.1 \ mingw48_32 \ include \ QtCore \ qglobal.h: 946: ошибка: ‘QAbstractListModel& QAbstractListModel :: operator = (const QAbstractListModel&) ‘является частным
Учебный класс &оператор = (постоянный класс &) Q_DECL_EQ_DELETE;
^
Как правильно сделать это?
Объекты типа QAbstractItemModels не могут быть скопированы, вы должны использовать указатель. Я бы использовал:
Q_PROPERTY(MyListModel* myListModel READ myListModel CONSTANT)
Поскольку вы не заменяете саму модель, а только ее содержимое, вам не нужен сигнал myListModelChanged (), и вы можете пометить его как CONSTANT
,
Ваш геттер уже имеет правильный тип, хотя он должен быть постоянным:
MyListModel *MyObject::myListModel() const
Других решений пока нет …