将 QML 中对象的 QAbstractListModel 派生列表模型成员绑定为Q_PROPERTY

Bind a QAbstractListModel derived listmodel member of an object in QML as Q_PROPERTY

本文关键字:绑定 成员 PROPERTY 模型 列表 QML 对象 派生 QAbstractListModel      更新时间:2023-10-16

我想出了如何将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: error: 'QAbstractListModel& QAbstractListModel::operator=(const QAbstractListModel&)' is private 类 &运算符=(常量类 &) Q_DECL_EQ_DELETE; ^

如何做到这一点?

QAbstractItemModels这样的QObjects无法复制,你必须使用指针。我会使用:

Q_PROPERTY(MyListModel* myListModel READ myListModel CONSTANT)

由于您不替换模型本身,只替换其内容,因此您不需要 myListModelChanged() 信号,可以将其标记为 CONSTANT

你的 getter 已经有正确的类型,尽管它应该是 const:

MyListModel *MyObject::myListModel() const