模型视图(08):【类】QStandardItemModel[官翻]

本文详细介绍了QStandardItemModel类,它是用于存储自定义数据的通用模型,是Qt模型/视图框架的一部分。文中说明了其使用方法,如添加、访问、插入、删除项,设置表头标签、搜索和排序等,还列举了相关属性、公共函数及重新实现的公共函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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接口,或者在适当的情况下使用两者的组合。

属性

  1. sortRole: int 对项进行排序时用于查询模型数据的项角色
    默认值是Qt::DisplayRole。

公共函数

构造析构

  1. QStandardItemModel(int rows, int columns, QObject *parent = nullptr)
  2. QStandardItemModel(QObject *parent = nullptr)
  3. virtual ~QStandardItemModel()

根节点

  1. QStandardItem * invisibleRootItem() const

清理

  1. void clear()
  2. bool clearItemData(const QModelIndex &index)

查找

  1. QList<QStandardItem *> findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const
  2. QModelIndex indexFromItem(const QStandardItem *item) const
  3. QStandardItem * itemFromIndex(const QModelIndex &index) const

修改行或列

  1. void appendColumn(const QList<QStandardItem *> &items)
  2. void appendRow(const QList<QStandardItem *> &items)
  3. void appendRow(QStandardItem *item)
  4. void insertColumn(int column, const QList<QStandardItem *> &items)
  5. bool insertColumn(int column, const QModelIndex &parent = QModelIndex())
  6. void insertRow(int row, const QList<QStandardItem *> &items)
  7. void insertRow(int row, QStandardItem *item)
  8. bool insertRow(int row, const QModelIndex &parent = QModelIndex())
  9. QList<QStandardItem *> takeColumn(int column)
  10. QList<QStandardItem *> takeRow(int row)

项操作

  1. QStandardItem * item(int row, int column = 0) const
  2. QStandardItem * takeItem(int row, int column = 0)
  3. void setItem(int row, int column, QStandardItem *item)
  4. void setItem(int row, QStandardItem *item)

属性

  1. const QStandardItem * itemPrototype() const
  2. void setItemPrototype(const QStandardItem *item)
  3. void setColumnCount(int columns)
  4. void setRowCount(int rows)

表头

  1. QStandardItem * horizontalHeaderItem(int column) const
  2. QStandardItem * takeHorizontalHeaderItem(int column)
  3. void setHorizontalHeaderItem(int column, QStandardItem *item)
  4. void setHorizontalHeaderLabels(const QStringList &labels)
  5. QStandardItem * verticalHeaderItem(int row) const
  6. QStandardItem * takeVerticalHeaderItem(int row)
  7. void setVerticalHeaderItem(int row, QStandardItem *item)
  8. void setVerticalHeaderLabels(const QStringList &labels)

排序

  1. void setItemRoleNames(const QHash<int, QByteArray> &roleNames)
  2. int sortRole() const
  3. void setSortRole(int role)

重新实现公共函数

行列相关

  1. virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override
  2. virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
  3. virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
  4. virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
  5. virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
  6. virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
  7. virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override

相关数据

  1. virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
  2. virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
  3. virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
  4. virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override
  5. virtual QMap<int, QVariant> itemData(const QModelIndex &index) const override
  6. virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) override

属性关系

  1. virtual Qt::ItemFlags flags(const QModelIndex &index) const override
  2. virtual QModelIndex parent(const QModelIndex &child) const override
  3. virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const override
  4. virtual QModelIndex sibling(int row, int column, const QModelIndex &idx) const override

排序

  1. virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override

拖放

  1. virtual Qt::DropActions supportedDropActions() const override
  2. virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
  3. virtual QMimeData * mimeData(const QModelIndexList &indexes) const override
  4. virtual QStringList mimeTypes() const override

参考

参见 :

  • QStandardItem
  • QAbstractItemModel
  • 简单树模型示例
  • 项目视图方便类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值