如何在扩展的QQuickItem中与模型交互



在处理Qt文档中的模型和视图方面,有很多不错的资源,比如:http://doc.qt.io/qt-5/model-view-programming.html,但我似乎找不到任何与QtQuick中的模型打交道的链接。有一些关于用c++扩展qml的基本章节,如http://doc.qt.io/qt-5/qtqml-tutorials-extending-qml-example.html,以及关于使用模型:http://doc-snapshots.qt.io/qt5-5.11/qtquick-modelviewsdata-modelview.html,但我找不到在扩展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();
}

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

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

*.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();
}

相关内容

  • 没有找到相关文章

最新更新