簡體   English   中英

將QML中的對象的QAbstractListModel派生的listmodel成員綁定為Q_PROPERTY

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

我想出了如何在QML中公開和綁定QAbstractListModel派生的listmodel的實例。

但我真正想做的是將一個對象暴露給QML並將一個QAbstractListModel派生的listmodel成員綁定為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&)'是私有Class&operator =(const Class&)Q_DECL_EQ_DELETE; ^

如何正確地做到這一點?

像QAbstractItemModels這樣的QObjects無法復制,必須使用指針。 我用的是:

Q_PROPERTY(MyListModel* myListModel READ myListModel CONSTANT)

由於您不替換模型本身,僅替換其內容,因此您不需要myListModelChanged()信號並將其標記為CONSTANT

你的getter已經有了正確的類型,雖然它應該是const:

MyListModel *MyObject::myListModel() const

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM