QStandardItemModel 类
QStandardItemModel类提供了用于存储自定义数据的通用模型。
Header: | #include < QStandardItemModel > |
---|---|
qmake: | QT += gui |
Inherits: | QAbstractItemModel |
Inherited By: |
详述
QStandardItemModel可以用作标准Qt数据类型的存储库。它是模型/视图类中的一员,是Qt的模型/视图框架的一部分。
QStandardItemModel为使用模型提供了一种经典的基于项目的方法。QStandardItemModel中的项由QStandardItem提供。
QStandardItemModel实现了QAbstractItemModel接口,这意味着该模型可以用于在支持该接口的任何视图中提供数据(比如QListView、QTableView和QTreeView,以及您自己的定制视图)。为了提高性能和灵活性,您可能想要子类QAbstractItemModel来提供对不同类型的数据存储库的支持。例如,QDirModel提供了一个底层文件系统的模型接口。
当您需要一个列表或树时,您通常会创建一个空的QStandardItemModel,并使用appendRow()向模型中添加项,使用item()访问项。如果您的模型表示一个表,那么您通常会将表的维数传递给QStandardItemModel构造函数,并使用setItem()将项定位到表中。您还可以使用setRowCount()和setColumnCount()来改变模型的尺寸。要插入项,使用insertRow()或insertColumn(),要删除项,使用removeRow()或removeColumn()。
您可以使用setHorizontalHeaderLabels()和setVerticalHeaderLabels()设置模型的头标签。
您可以使用findItems()搜索模型中的项,并通过调用sort()对模型进行排序。
调用clear()从模型中删除所有项。
一个使用QStandardItemModel创建表的例子:
QStandardItemModel model(4, 4);
for (int row = 0; row < model.rowCount(); ++row) {
for (int column = 0; column < model.columnCount(); ++column) {
QStandardItem *item = new QStandardItem(QString("row %0, column %1")
.arg(row).arg(column));
model.setItem(row, column, item);
}
}
QTableView table;
table.setModel(&model);
table.show();
一个使用QStandardItemModel创建树的例子:
QStandardItemModel model;
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 4; ++i) {
QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
parentItem->appendRow(item);
parentItem = item;
}
QTreeView tree;
tree.setModel(&model);
tree.show();
在视图上设置模型之后,您通常希望对用户操作做出反应,例如单击一个项。因为QAbstractItemView提供了基于QModelIndex的信号和函数,所以您需要一种方法来获取对应于给定QModelIndex的QStandardItem,反之亦然。itemFromIndex()和indexFromItem()提供这个映射。itemFromIndex()的典型用法包括获取视图中当前索引处的项,以及获取与QAbstractItemView信号所携带的索引相对应的项,例如QAbstractItemView::clicked()。首先,你将视图的信号连接到你的类中的一个槽:
QTreeView *treeView = new QTreeView(this);
treeView->setModel(myStandardItemModel);
connect(treeView, &QTreeView::clicked, this, &MyWidget::clicked);
当你收到信号,你调用itemFromIndex()在给定的模型索引上得到一个指向项目的指针:
void MyWidget::clicked(const QModelIndex &index)
{
QStandardItem *item = myStandardItemModel->itemFromIndex(index);
// Do stuff with the item ...
}
相反,当您想要调用以索引作为参数的模型/视图函数时,您必须获得项的QModelIndex。你可以通过使用模型的indexFromItem()函数来获得索引,或者,同样的,通过调用QStandardItem::index():
treeView->scrollTo(item->index());
当然,您并不需要使用基于项目的方法;在使用模型时,您可以完全依赖QAbstractItemModel接口,或者在适当的情况下使用两者的组合。
属性
- sortRole: int 对项进行排序时用于查询模型数据的项角色
默认值是Qt::DisplayRole。
公共函数
构造析构
- QStandardItemModel(int rows, int columns, QObject *parent = nullptr)
- QStandardItemModel(QObject *parent = nullptr)
- virtual ~QStandardItemModel()
根节点
- QStandardItem * invisibleRootItem() const
清理
- void clear()
- bool clearItemData(const QModelIndex &index)
查找
- QList<QStandardItem *> findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const
- QModelIndex indexFromItem(const QStandardItem *item) const
- QStandardItem * itemFromIndex(const QModelIndex &index) const
修改行或列
- void appendColumn(const QList<QStandardItem *> &items)
- void appendRow(const QList<QStandardItem *> &items)
- void appendRow(QStandardItem *item)
- void insertColumn(int column, const QList<QStandardItem *> &items)
- bool insertColumn(int column, const QModelIndex &parent = QModelIndex())
- void insertRow(int row, const QList<QStandardItem *> &items)
- void insertRow(int row, QStandardItem *item)
- bool insertRow(int row, const QModelIndex &parent = QModelIndex())
- QList<QStandardItem *> takeColumn(int column)
- QList<QStandardItem *> takeRow(int row)
项操作
- QStandardItem * item(int row, int column = 0) const
- QStandardItem * takeItem(int row, int column = 0)
- void setItem(int row, int column, QStandardItem *item)
- void setItem(int row, QStandardItem *item)
属性
- const QStandardItem * itemPrototype() const
- void setItemPrototype(const QStandardItem *item)
- void setColumnCount(int columns)
- void setRowCount(int rows)
表头
- QStandardItem * horizontalHeaderItem(int column) const
- QStandardItem * takeHorizontalHeaderItem(int column)
- void setHorizontalHeaderItem(int column, QStandardItem *item)
- void setHorizontalHeaderLabels(const QStringList &labels)
- QStandardItem * verticalHeaderItem(int row) const
- QStandardItem * takeVerticalHeaderItem(int row)
- void setVerticalHeaderItem(int row, QStandardItem *item)
- void setVerticalHeaderLabels(const QStringList &labels)
排序
- void setItemRoleNames(const QHash<int, QByteArray> &roleNames)
- int sortRole() const
- void setSortRole(int role)
重新实现公共函数
行列相关
- virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override
- virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
- virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
- virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
- virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
- virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
- virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
相关数据
- virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
- virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
- virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
- virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override
- virtual QMap<int, QVariant> itemData(const QModelIndex &index) const override
- virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) override
属性关系
- virtual Qt::ItemFlags flags(const QModelIndex &index) const override
- virtual QModelIndex parent(const QModelIndex &child) const override
- virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const override
- virtual QModelIndex sibling(int row, int column, const QModelIndex &idx) const override
排序
- virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override
拖放
- virtual Qt::DropActions supportedDropActions() const override
- virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
- virtual QMimeData * mimeData(const QModelIndexList &indexes) const override
- virtual QStringList mimeTypes() const override
参考
参见 :
- QStandardItem
- QAbstractItemModel
- 简单树模型示例
- 项目视图方便类