【问题标题】:Bind a QAbstractListModel derived listmodel member of an object in QML as Q_PROPERTY将 QML 中对象的 QAbstractListModel 派生列表模型成员绑定为 Q_PROPERTY
【发布时间】:2014-02-14 07:27:45
【问题描述】:

我想出了如何在 QML 中公开和绑定 QAbstractListModel 派生列表模型的实例。

但我真正想做的是向 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_DECL_EQ_DELETE; ^

正确的做法是什么?

【问题讨论】:

    标签: c++ qt qml qt-quick qabstractlistmodel


    【解决方案1】:

    像 QAbstractItemModels 这样的 QObjects 不能被复制,你必须使用指针。我会使用:

    Q_PROPERTY(MyListModel* myListModel READ myListModel CONSTANT)
    

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

    你的 getter 已经有了正确的类型,虽然它应该是 const:

    MyListModel *MyObject::myListModel() const
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-07
      • 2014-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多