QStandardItemModel Class

QStandardItemModel 类为存储自定义数据提供了一个通用模型。更多

Header: #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.NET 提供。

QStandardItemModel 实现了QAbstractItemModel 接口,这意味着该模型可用于在任何支持该接口的视图(如QListViewQTableViewQTreeView 以及您自己的自定义视图)中提供数据。为了提高性能和灵活性,您可能需要对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简单树模型示例,以及项视图便利类

属性文档

[bindable] sortRole : int

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

此属性保存用于在对项目排序时查询模型数据的项目角色。

默认值为Qt::DisplayRole

另请参阅 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

使用给定的flags ,返回在给定的column 中与给定的text 匹配的项目列表。

[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

如果已设置rowcolumn ,则返回给定 和 的项目;否则返回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() )时,调用该函数通常是第一步。在您的槽中,以信号携带的QModelIndex 为参数调用 itemFromIndex(),以获取指向相应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)

将给定的rowcolumn 的项目设置为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() 常量。

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()。

© 2025 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.