C++ 如何与扩展QQuickItem中的模型交互?

C++ 如何与扩展QQuickItem中的模型交互?,c++,qt,qml,qt5,qtquick2,C++,Qt,Qml,Qt5,Qtquick2,在Qt文档中有很多关于处理模型和视图的好资源,比如:,但是我似乎找不到任何与QtQuick中处理模型相关的链接。关于使用QC++来扩展QML的一些基本章节,如在IN和ON中使用模型,但是我无法很好地找到一种在扩展QML中使用实际模型的方法。 目前我有这种型号: class LayoutModel : public QAbstractItemModel { Q_OBJECT public: explicit LayoutModel(const QString &data, QOb

在Qt文档中有很多关于处理模型和视图的好资源,比如:,但是我似乎找不到任何与QtQuick中处理模型相关的链接。关于使用QC++来扩展QML的一些基本章节,如在IN和ON中使用模型,但是我无法很好地找到一种在扩展QML中使用实际模型的方法。 目前我有这种型号:

class LayoutModel : public QAbstractItemModel {
  Q_OBJECT

public:
  explicit LayoutModel(const QString &data, QObject *parent = 0);
  ~LayoutModel();

  QVariant data(const QModelIndex &index, int role) const override;
  Qt::ItemFlags flags(const QModelIndex &index) const override;
  QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
  QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
  QModelIndex parent(const QModelIndex &index) const override;
  int rowCount(const QModelIndex &parent = QModelIndex()) const override;
  int columnCount(const QModelIndex &parent = QModelIndex()) const override;

private:
  void setupModelData(const QStringList &lines, LayoutItem *parent);

  LayoutItem *rootItem;
};
我正试图从这个视图类访问它:

class Layout : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(LayoutModel model READ model WRITE setModel NOTIFY modelChanged)

   private:
    LayoutModel & m_model;

   public:
    explicit Layout(QQuickItem * parent = nullptr);

    LayoutModel & model() const;
    void setModel(const LayoutModel & model);

    void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData & value) override;
    void geometryChanged(const QRectF & newGeometry, const QRectF & oldGeometry) override;

   signals:
    void modelChanged();
};
但是我找不到一种方法来实际使用这个模型。我甚至不能正确地设置对模型的读写,因为QAbstractItemModels(以及一般的Qt中的模型)删除了它们的副本构造函数以强制执行实体奇点。以下是我当前的中断实现:

Layout::Layout(QQuickItem * parent) : QQuickItem(parent) {}

LayoutList & Layout::model() const
{
    return m_model;
}

void Layout::setModel(const LayoutList & model)
{
    if (m_model == model)
        return;

    m_model = model;
    emit modelChanged();
}

那么,我如何使它能够与我的LayoutModel一起使用这个扩展的qml类呢?

QObject
s没有复制构造函数,因此您必须使用指针:

*.h

class Layout : public QQuickItem
{
    Q_OBJECT
    Q_PROPERTY(LayoutModel *model READ model WRITE setModel NOTIFY modelChanged)

   private:
    LayoutModel *m_model;

   public:
    explicit Layout(QQuickItem * parent = nullptr);

    LayoutModel *model();
    void setModel(LayoutModel * model);
    ...
   signals:
    void modelChanged();
};
*.cpp

...

LayoutModel  *Layout::model() 
{
    return m_model;
}

void Layout::setModel(LayoutModel *model)
{
    if (m_model == model)
        return;
    m_model = model;
    emit modelChanged();
}

指针将通过QML工作,以支持
布局{model:myModel}