Привязать полученный из QAbstractListModel элемент listmodel объекта в QML как Q_PROPERTY

Я выяснил, как представить и связать экземпляр производной модели списка 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&)' является частным классом &operator=(const Class &) Q_DELLEQ ^

Как правильно сделать это?

1 ответ

Решение

Объекты типа QAbstractItemModels не могут быть скопированы, вы должны использовать указатель. Я бы использовал:

Q_PROPERTY(MyListModel* myListModel READ myListModel CONSTANT)

Поскольку вы не заменяете саму модель, а только ее содержимое, вам не нужен сигнал myListModelChanged(), и вы можете пометить его как CONSTANT,

Ваш геттер уже имеет правильный тип, хотя он должен быть постоянным:

MyListModel *MyObject::myListModel() const
Другие вопросы по тегам