本页内容

QStandardItemModel Class

QStandardItemModel 类提供了一个用于存储自定义数据的通用模型。更多内容...

头文件: #include <QStandardItemModel>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
继承自: QAbstractItemModel

属性

公共函数

QStandardItemModel(QObject *parent = nullptr)
QStandardItemModel(int rows, int columns, QObject *parent = nullptr)
virtual ~QStandardItemModel()
void appendColumn(const QList<QStandardItem *> &items)
void appendRow(const QList<QStandardItem *> &items)
void appendRow(QStandardItem *item)
QBindable<int> bindableSortRole()
void clear()
QList<QStandardItem *> findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const
QStandardItem *horizontalHeaderItem(int column) const
QModelIndex indexFromItem(const QStandardItem *item) const
void insertColumn(int column, const QList<QStandardItem *> &items)
bool insertColumn(int column, const QModelIndex &parent = QModelIndex())
void insertRow(int row, const QList<QStandardItem *> &items)
bool insertRow(int row, const QModelIndex &parent = QModelIndex())
void insertRow(int row, QStandardItem *item)
QStandardItem *invisibleRootItem() const
QStandardItem *item(int row, int column = 0) const
QStandardItem *itemFromIndex(const QModelIndex &index) const
const QStandardItem *itemPrototype() const
void setColumnCount(int columns)
void setHorizontalHeaderItem(int column, QStandardItem *item)
void setHorizontalHeaderLabels(const QStringList &labels)
void setItem(int row, int column, QStandardItem *item)
void setItem(int row, QStandardItem *item)
void setItemPrototype(const QStandardItem *item)
void setItemRoleNames(const QHash<int, QByteArray> &roleNames)
void setRowCount(int rows)
void setSortRole(int role)
void setVerticalHeaderItem(int row, QStandardItem *item)
void setVerticalHeaderLabels(const QStringList &labels)
int sortRole() const
QList<QStandardItem *> takeColumn(int column)
QStandardItem *takeHorizontalHeaderItem(int column)
QStandardItem *takeItem(int row, int column = 0)
QList<QStandardItem *> takeRow(int row)
QStandardItem *takeVerticalHeaderItem(int row)
QStandardItem *verticalHeaderItem(int row) const

重新实现的公共函数

virtual bool clearItemData(const QModelIndex &index) override
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
virtual Qt::ItemFlags flags(const QModelIndex &index) const override
virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const override
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
virtual QModelIndex index(int row, int column, 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 QMap<int, QVariant> itemData(const QModelIndex &index) const override
virtual QMimeData *mimeData(const QModelIndexList &indexes) const override
virtual QStringList mimeTypes() const override
virtual void multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const override
virtual QModelIndex parent(const QModelIndex &child) const 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 QHash<int, QByteArray> roleNames() const override
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override
virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) override
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override
virtual Qt::DropActions supportedDropActions() const override

信号

void itemChanged(QStandardItem *item)

详细说明

QStandardItemModel 可用作标准 Qt 数据类型的存储库。它是模型/视图类之一,属于 Qt的模型/视图框架。

QStandardItemModel 提供了一种基于项的经典方法来操作模型。QStandardItemModel 中的项由QStandardItem 提供。

QStandardItemModel 实现了QAbstractItemModel 接口,这意味着该模型可用于为任何支持该接口的视图(例如QListView 、QTableView 和QTreeView ,以及您自定义的视图)提供数据。 出于性能和灵活性的考虑,您可能需要继承QAbstractItemModel 类,以支持不同类型的数据存储库。例如,QFileSystemModel 类为底层文件系统提供了一个模型接口。

当需要列表或树结构时,通常会创建一个空的 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);
    }
}

使用 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;
}

在将模型设置到视图后,通常需要响应用户操作,例如点击某项。由于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 ` 接口,也可以根据实际情况将这两种方法结合使用。

另请参阅 QStandardItem 、模型/视图编程、QAbstractItemModel 、QRangeModel 、简单树模型示例以及 项视图便捷类。

属性文档

[bindable] sortRole : int

注意:此 属性支持QProperty 绑定。

该属性存储用于在排序项目时查询模型数据的项角色

默认值为Qt::DisplayRole 。

访问函数:

int sortRole() const
void setSortRole(int role)

另请参阅 sort() 和QStandardItem::sortChildren()。

成员函数文档

[explicit] QStandardItemModel::QStandardItemModel(QObject *parent = nullptr)

使用给定的parent 构建一个新的项目模型。

QStandardItemModel::QStandardItemModel(int rows, int columns, QObject *parent = nullptr)

构建一个新的项目模型,该模型初始时具有rows 行和columns 列,并具有给定的parent 。

[virtual noexcept] QStandardItemModel::~QStandardItemModel()

销毁该模型。该模型将销毁其所有物品。

void QStandardItemModel::appendColumn(const QList<QStandardItem *> &items)

追加一列,其中包含items 。如有必要,行数将增加至items 的大小。

另请参阅 insertColumn() 和appendRow()。

void QStandardItemModel::appendRow(const QList<QStandardItem *> &items)

在表尾追加一行,该行包含items 。如有必要,列数将增加至items 的大小。

另请参阅 insertRow() 和appendColumn()。

void QStandardItemModel::appendRow(QStandardItem *item)

在构建仅含一列的列表或树时,该函数提供了一种便捷的方式来追加单个新的item 。

这是一个重载函数。

void QStandardItemModel::clear()

从模型中删除所有项目(包括标题项),并将行数和列数设置为零。

另请参阅 removeColumns() 和removeRows()。

[override virtual] bool QStandardItemModel::clearItemData(const QModelIndex &index)

重写了:QAbstractItemModel::clearItemData(const QModelIndex &index)。

[override virtual] int QStandardItemModel::columnCount(const QModelIndex &parent = QModelIndex()) const

重写了:QAbstractItemModel::columnCount(const QModelIndex &parent) const。

另请参阅 setColumnCount()。

[override virtual] QVariant QStandardItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const

重写了:QAbstractItemModel::data(const QModelIndex &index, int role) const。

另请参阅 setData()。

[override virtual] bool QStandardItemModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)

重写了:QAbstractItemModel::dropMimeData (const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)。

QList<QStandardItem *> QStandardItemModel::findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const

返回一个项目列表,其中包含符合给定text 、使用给定flags 并在给定column 中检索到的项目。

[override virtual] Qt::ItemFlags QStandardItemModel::flags(const QModelIndex &index) const

重写了:QAbstractItemModel::flags(const QModelIndex &index) const。

[override virtual] bool QStandardItemModel::hasChildren(const QModelIndex &parent = QModelIndex()) const

重写了:QAbstractItemModel::hasChildren(const QModelIndex &parent) const。

[override virtual] QVariant QStandardItemModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

重写了:QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role) const。

另请参阅 setHeaderData()。

QStandardItem *QStandardItemModel::horizontalHeaderItem(int column) const

如果已设置column ,则返回其水平标题项;否则返回nullptr 。

另请参阅 setHorizontalHeaderItem() 和verticalHeaderItem()。

[override virtual] QModelIndex QStandardItemModel::index(int row, int column, const QModelIndex &parent = QModelIndex()) const

重写了:QAbstractItemModel::index(int row, int column, const QModelIndex &parent) const。

QModelIndex QStandardItemModel::indexFromItem(const QStandardItem *item) const

返回与给定的item 关联的QModelIndex 。

当您需要执行某项操作且该操作需要该项的QModelIndex 时,请使用此函数,例如QAbstractItemView::scrollTo()。QStandardItem::index() 仅为方便起见而提供;它等同于调用此函数。

另请参阅 itemFromIndex() 和QStandardItem::index()。

void QStandardItemModel::insertColumn(int column, const QList<QStandardItem *> &items)

在column 处插入一列,内容为items 。如有必要,行数将增加至items 的大小。

另请参阅 takeColumn()、appendColumn() 和insertRow()。

bool QStandardItemModel::insertColumn(int column, const QModelIndex &parent = QModelIndex())

在指定的parent 的子项中,于给定的column 之前插入一列。如果成功插入该列,则返回true ;否则返回false 。

另请参阅 insertColumns()、insertRow() 和removeColumn()。

[override virtual] bool QStandardItemModel::insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())

重写了:QAbstractItemModel::insertColumns(int column, int count, const QModelIndex &parent)。

void QStandardItemModel::insertRow(int row, const QList<QStandardItem *> &items)

在row 位置插入一行,内容为items 。如有必要,列数将增加至items 的大小。

另请参阅 takeRow()、appendRow() 和insertColumn()。

bool QStandardItemModel::insertRow(int row, const QModelIndex &parent = QModelIndex())

在指定的parent 的子项中,于给定的row 之前插入一行。如果行已插入,则返回true ;否则返回false 。

另请参阅 insertRows()、insertColumn() 和removeRow()。

void QStandardItemModel::insertRow(int row, QStandardItem *item)

在row 处插入一行,内容为item 。

在构建仅含一列的列表或树时,此函数提供了一种便捷的方式来追加单个新项。

这是一个重载函数。

[override virtual] bool QStandardItemModel::insertRows(int row, int count, const QModelIndex &parent = QModelIndex())

重写了:QAbstractItemModel::insertRows (int row, int count, const QModelIndex &parent)。

QStandardItem *QStandardItemModel::invisibleRootItem() const

返回模型的不可见根项。

该不可见根项可通过QStandardItem API访问模型的顶级项,从而能够编写以统一方式处理顶级项及其子项的函数;例如,涉及树模型的递归函数。

注意: 对从本函数获取的QStandardItem 对象调用 index()是不有效的。

QStandardItem *QStandardItemModel::item(int row, int column = 0) const

返回给定row 对应的项;如果已设置column ,则返回其值;否则返回nullptr 。

另请参阅 setItem()、takeItem() 和itemFromIndex()。

[signal] void QStandardItemModel::itemChanged(QStandardItem *item)

每当item 的数据发生变化时,都会触发此信号。

[override virtual] QMap<int, QVariant> QStandardItemModel::itemData(const QModelIndex &index) const

重写了:QAbstractItemModel::itemData(const QModelIndex &index) const。

另请参阅 setItemData()。

QStandardItem *QStandardItemModel::itemFromIndex(const QModelIndex &index) const

返回指向与给定的 `index` 关联的 `QStandardItem ` 的指针。

调用此函数通常是处理来自视图的基于QModelIndex 的信号(例如QAbstractItemView::activated ())时的第一步。在您的槽函数中,您需要调用itemFromIndex(),并将信号携带的QModelIndex 作为参数传入,以获取对应QStandardItem 的指针。

请注意,如果该索引处尚不存在项目,此函数将延迟创建一个项目(使用itemPrototype()),并将其设置在父项的子项表中。

如果index 是无效索引,则该函数返回nullptr 。

另请参阅 indexFromItem()。

const QStandardItem *QStandardItemModel::itemPrototype() const

返回模型所使用的项目原型。当模型需要按需构建新项目时(例如,当视图或项目委托调用 `setData()` 时),它会将该项目原型用作项目生成器。

另请参阅 setItemPrototype()。

[override virtual] QMimeData *QStandardItemModel::mimeData(const QModelIndexList &indexes) const

重写了:QAbstractItemModel::mimeData(const QModelIndexList &indexes) const。

[override virtual] QStringList QStandardItemModel::mimeTypes() const

重新实现了:QAbstractItemModel::mimeTypes() const。

[override virtual] void QStandardItemModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const

重写了:QAbstractItemModel::multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const。

[override virtual] QModelIndex QStandardItemModel::parent(const QModelIndex &child) const

重写了:QAbstractItemModel::parent(const QModelIndex &index) const。

[override virtual] bool QStandardItemModel::removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

重写了:QAbstractItemModel::removeColumns (int column, int count, const QModelIndex &parent)。

[override virtual] bool QStandardItemModel::removeRows(int row, int count, const QModelIndex &parent = QModelIndex())

重写了:QAbstractItemModel::removeRows (int row, int count, const QModelIndex &parent)。

[override virtual] QHash<int, QByteArray> QStandardItemModel::roleNames() const

重新实现了:QAbstractItemModel::roleNames() const。

[override virtual] int QStandardItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const

重写了:QAbstractItemModel::rowCount(const QModelIndex &parent) const。

另请参阅 setRowCount()。

void QStandardItemModel::setColumnCount(int columns)

将该模型的列数设置为columns 。如果该数值小于columnCount(),则会舍弃不需要的列中的数据。

另请参阅 columnCount() 和setRowCount()。

[override virtual] bool QStandardItemModel::setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)

重写了:QAbstractItemModel::setData (const QModelIndex &index, const QVariant &value, int role)。

另请参阅 data()。

[override virtual] bool QStandardItemModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)

重写了:QAbstractItemModel::setHeaderData (int section, Qt::Orientation orientation, const QVariant &value, int role)。

另请参见 headerData()。

void QStandardItemModel::setHorizontalHeaderItem(int column, QStandardItem *item)

将column 的水平标题项设置为item 。模型将接管该项的所有权。如有必要,将增加列数以容纳该项。之前的标题项(如有)将被删除。

另请参阅 horizontalHeaderItem()、setHorizontalHeaderLabels() 和setVerticalHeaderItem()。

void QStandardItemModel::setHorizontalHeaderLabels(const QStringList &labels)

使用 `labels` 设置水平标题标签。如有必要,列数将增加至 `labels` 的大小。

另请参阅 setHorizontalHeaderItem()。

void QStandardItemModel::setItem(int row, int column, QStandardItem *item)

将给定row 和column 对应的项设置为item 。模型将拥有该项的所有权。如有必要,行数和列数将相应增加以容纳该项。给定位置上的先前项(如有)将被删除。

另请参阅 item()。

void QStandardItemModel::setItem(int row, QStandardItem *item)

这是一个重载函数。

[override virtual] bool QStandardItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)

重写了:QAbstractItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)。

另请参阅 itemData()。

void QStandardItemModel::setItemPrototype(const QStandardItem *item)

将模型的项目原型设置为指定的item 。该模型将拥有该原型。

该项原型通过调用QStandardItem::clone()函数,充当QStandardItem 的生成器。若要提供自定义原型,请继承QStandardItem 类,重写QStandardItem::clone()方法,并将原型设置为自定义类的实例。 每当QStandardItemModel 需要按需创建项目(例如,当视图或项目委托调用setData ())时,新创建的项目将是你自定义类的实例。

另请参阅 itemPrototype() 和QStandardItem::clone()。

void QStandardItemModel::setItemRoleNames(const QHash<int, QByteArray> &roleNames)

将项目角色名称设置为“roleNames ”。

void QStandardItemModel::setRowCount(int rows)

将该模型的行数设置为rows 。如果该数值小于rowCount(),则会舍弃不需要的行中的数据。

另请参阅 rowCount() 和setColumnCount()。

void QStandardItemModel::setVerticalHeaderItem(int row, QStandardItem *item)

将row 的垂直标题项设置为item 。模型将获得该项的所有权。如有必要,行数将相应增加以容纳该项。之前的标题项(如有)将被删除。

另请参阅 verticalHeaderItem()、setVerticalHeaderLabels() 和setHorizontalHeaderItem()。

void QStandardItemModel::setVerticalHeaderLabels(const QStringList &labels)

使用 `labels` 设置垂直标题标签。如有必要,行数将增加至 `labels` 的大小。

另请参阅 setVerticalHeaderItem()。

[override virtual] void QStandardItemModel::sort(int column, Qt::SortOrder order = Qt::AscendingOrder)

重写了:QAbstractItemModel::sort (int column, Qt::SortOrder order)。

[override virtual] Qt::DropActions QStandardItemModel::supportedDropActions() const

重新实现了:QAbstractItemModel::supportedDropActions() const。

QStandardItemModel 同时支持复制和移动。

QList<QStandardItem *> QStandardItemModel::takeColumn(int column)

移除给定的column ,同时不删除该列中的项目,并返回一个指向已移除项目的指针列表。模型将释放对这些项目的所有权。对于该列中尚未设置的项目,列表中的相应指针将为nullptr 。

另请参阅 takeRow()。

QStandardItem *QStandardItemModel::takeHorizontalHeaderItem(int column)

从页眉中移除位于column 的水平页眉项(但不删除该项),并返回该项的指针。该模型将释放对该项的所有权。

另请参阅 horizontalHeaderItem() 和takeVerticalHeaderItem()。

QStandardItem *QStandardItemModel::takeItem(int row, int column = 0)

移除位于 (row,column) 处的项目,但不将其删除。该模型将释放对该项目的所有权。

另请参阅 item()、takeRow() 和takeColumn()。

QList<QStandardItem *> QStandardItemModel::takeRow(int row)

移除指定的row ,同时不删除行中的项目,并返回一个指向已移除项目的指针列表。模型将释放对这些项目的所有权。对于行中尚未设置的项目,列表中的相应指针将为nullptr 。

另请参阅 takeColumn()。

QStandardItem *QStandardItemModel::takeVerticalHeaderItem(int row)

从页眉中移除位于row 的垂直页眉项(不将其删除),并返回该项的指针。模型将释放对该项的所有权。

另请参阅 verticalHeaderItem() 和takeHorizontalHeaderItem()。

QStandardItem *QStandardItemModel::verticalHeaderItem(int row) const

如果已设置行row 的垂直标题项,则返回该项;否则返回nullptr 。

另请参阅 setVerticalHeaderItem() 和horizontalHeaderItem()。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.