Qt—QStandardItemModel

1 说明

QStandardItemModel是Qt库中的一个类,它是QAbstractItemModel的一个子类。它可以用来存储和管理数据,并且可以通过Qt视图类(如QListView、QTreeView等)来显示这些数据。它采用了树型结构存储数据,每一个节点对应一个QStandardItem对象。使用这个类可以简化数据的管理和显示过程。

2 函数

2.1 构造函数

QStandardItemModel(int rows, int columns, QObject *parent = nullptr)
QStandardItemModel::QStandardItemModel(int rows, int columns, QObject *parent = nullptr) 是 QStandardItemModel 类的一种构造函数,用于创建一个具有指定行数和列数的标准项模型。

rows: 指定模型的行数。
columns: 指定模型的列数。
parent: 指定父对象,可以为nullptr
当使用这个构造函数创建模型后,模型会自动创建 rows * columns 个项目,并使用默认值进行初始化

QStandardItemModel(QObject *parent = nullptr)
可以通过setRowCount和setColumnCount函数设置行和列
也可以通过setHorizontalHeaderLabels函数设置表头,间接确定列数

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

2.2 追加列\行

void appendColumn(const QList<QStandardItem *> &items)
它可以在模型的最后一列后面添加一列并将给定的一组项目插入到新列中。
items: 指定要插入到新列中的一组项目,这些项目将会按照顺序插入到新列的不同行中。

请注意,如果传递给函数的列表中的项目数量小于模型中现有的行数,则多余的行将被填充为空项目。如果传递给函数的列表中的项目数量大于模型中现有的行数,则会自动增加模型的行数,以容纳所有项目。

    QList<QStandardItem *> items;
    for(int i=0;i<3;i++)
    {
        items<<new QStandardItem(QString::number(i));
    }
    model->appendColumn(items);

void appendRow(const QList<QStandardItem *> &items)
追加一行,用法同上

void appendRow(QStandardItem *item)
它可以在模型的最后一行后面添加一行并将给定的项目插入到新行中。
item: 指定要插入到新行中的项目
请注意, 使用这种方法添加的行只有一个元素,需要多加元素可以用 appendRow(const QList<QStandardItem *> &items)来添加.

2.3 清除、删除并返回指定行或列

void QStandardItemModel::clear()
它用于删除模型中的所有行和列。
这个函数会删除模型中所有的项目,同时也会删除所有的水平和垂直表头项目。模型将会被重置为空。

请注意, 这个函数会使用 QAbstractItemModel::beginRemoveRows() 和 QAbstractItemModel::endRemoveRows() 通知视图模型数据的变化, 一般的使用场景是在初始化或者重置数据的时候使用,可以避免一些不必要的数据重复.

bool clearItemData(const QModelIndex &index)
它可以清空在指定索引处的项目的全部角色值。
index: 指定要清空的项目的索引。

 QModelIndex index = model->index(1,1);
 model->clearItemData(index);

QList<QStandardItem *> QStandardItemModel::takeColumn(int column)
函数从模型中删除给定的列,并返回包含这一列中所有项目的列表。删除列之后,这些项目将不会显示在视图中,并且不再受模型管理。这些项目可以被插入到其他模型或添加到其他位置。
如果列不存在或者指定的列的索引小于0或者大于columnCount(),函数将返回空列表。

这种方法可能会在一些特定情境下使用,像某些操作结束后需要把数据从模型中提取并进行一些特定处理。如果只是想要清除模型中的数据,建议使用clear()函数。

QList<QStandardItem *> takeRow(int row)
同上

QStandardItem * takeHorizontalHeaderItem(int column)
模型中删除指定的列的水平标题项目,并返回该项目的指针。如果没有指定的标题项目,则返回nullptr.

这个方法可以用来替换或移除水平头项目. 比如说在某些时候需要自定义标题项目进行展示而不是默认提供的那一个.
在移除后, 水平标题项目将不再显示在视图中并且不再受模型管理. 这个项目可以被插入到其他模型或添加到其他位置.

如果列不存在或者指定的列的索引小于0或者大于columnCount(),函数将返回nullptr.
QStandardItem * takeVerticalHeaderItem(int row)
同上
QStandardItem * takeItem(int row, int column = 0)
函数从模型中删除指定行和列的项目,并返回该项目的指针。如果没有在该位置的项目,则返回nullptr。

这个方法可以用来删除或替换项目. 这个项目将不再显示在视图中并且不再受模型管理. 这个项目可以被插入到其他模型或添加到其他位置.

如果行或列索引小于0或大于行数或列数,或者给定位置不包含项目,函数将返回nullptr.

2.4 查找

QList<QStandardItem *> findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const
它可以在模型中查找包含给定文本的项目。

text: 指定要查找的文本。
flags: 指定匹配文本时使用的匹配标志。Qt::MatchExactly是默认值
column: 指定要在哪一列中查找项目,默认值为0

该函数返回包含所有找到的项目。如果未找到任何项目,则返回空列表。

Qt::MatchFlags 包括以下标志:

  • Qt::MatchExactly: 匹配整个字符串。
  • Qt::MatchContains: 匹配包含给定文本的所有项目。
  • Qt::MatchStartsWith: 匹配以给定文本开头的所有项目。
  • Qt::MatchEndsWith: 匹配以给定文本结尾的所有项目。
  • Qt::MatchRegExp: 使用正则表达式匹配所有项目。
  • Qt::MatchWildcard: 使用通配符匹配所有项目。
  • Qt::MatchCaseSensitive: 区分大小写进行匹配。
  • Qt::MatchWrap: 超出范围时回到开头。
  • Qt::MatchRecursive: 递归搜索。
    QList<QStandardItem *> items = model->findItems("Bobe",Qt::MatchExactly,0);
    qDebug()<<items.count();

    foreach(auto item,items)
    {
        qDebug()<<item->background();
    }

2.5 设置水平\垂直表头项目

QStandardItem * horizontalHeaderItem(int column) const
它可以返回指定列的水平表头项目。
column: 指定要返回水平表头项目的列索引。

void QStandardItemModel::setHorizontalHeaderItem(int column, QStandardItem *item)
它可以在指定列中设置水平表头项目。
column: 指定要设置水平表头项目的列索引。
item: 指定要设置为水平表头项目的项目。

  QStandardItem * item = model->horizontalHeaderItem(0);
    qDebug()<<item->text();

    QStandardItem* item2 = new QStandardItem("test");
    model->setHorizontalHeaderItem(3,item2);

void setHorizontalHeaderLabels(const QStringList &labels)
它用来设置模型的水平表头标签.
labels: 一个字符串列表,包含了表头的标签

QStandardItemModel* model = new QStandardItemModel();
QStringList labels;
labels << "Column 1" << "Column 2" << "Column 3";
model->setHorizontalHeaderLabels(labels);

上面的代码会设置模型的水平表头标签为"Column 1", "Column 2", "Column 3".

这个函数很好用,可以一次性的设置多个表头标签,而不需要逐一设置每个表头标签,可以简化代码.
并且如果表头标签需要修改,只需要重新调用这个函数即可.

QStandardItem * verticalHeaderItem(int row) const
void setVerticalHeaderItem(int row, QStandardItem *item)
void setVerticalHeaderLabels(const QStringList &labels)
用法同上

2.6 获得模型索引

QModelIndex QStandardItemModel::indexFromItem(const QStandardItem *item) const
它可以返回给定项目的模型索引。
item: 指定要查找索引的项目。

 QStandardItem* item = model->findItems("Tom",Qt::MatchExactly,0).at(0);
 QModelIndex index = model->indexFromItem(item);
 qDebug()<<index;//QModelIndex(1,0,0x15a8210,QStandardItemModel(0x15a8120))

QStandardItem* item = new QStandardItem("Tom");//虽然表格中Tom,但是这是个新建的没有加入到表格中
QModelIndex index = model->indexFromItem(item);
qDebug()<<index;//QModelIndex(-1,-1,0x0,QObject(0x0))

请注意,如果给定项目不属于模型中的项目或不存在(必须是已存在的项目),则返回 QModelIndex()。该函数是一种方便的方法来获取项目在模型中的索

2.7 插入

void insertColumn(int column, const QList<QStandardItem *> &items)
它可以在指定的列之前插入一列,并在新列中插入给定的项目。
column: 指定要插入新列的位置的列索引。
items: 指定要插入新列的项目列表。

bool insertColumn(int column, const QModelIndex &parent = QModelIndex())
它可以在给定父项目下的指定列之前插入一列。
column:指定新列的位置的列索引。
parent:父项目的模型索引,只有在此索引下的列才会被插入。
如果指定的列超出了父项目的范围,或者父项目为无效,则此函数将返回 false。
请注意使用这个函数会使用 QAbstractItemModel::columnsAboutToBeInserted() 和 QAbstractItemModel::columnsInserted() 通知视图模型列的插入。

//插入成功
 QStandardItem *item1 = new QStandardItem("mmm");
 QStandardItem *root = model->invisibleRootItem();
 root->appendRow(item1);
 bool ok = model->insertColumn(0,model->indexFromItem(item1));
 if(ok)
     qDebug()<<"sucess";
//插入失败
QModelIndex index = model->index(1,1);
  bool ok = model->insertColumn(1,index);
  if(!ok)
      qDebug()<<"failure";

void insertRow(int row, const QList<QStandardItem *> &items)
用法参考列
void insertRow(int row, QStandardItem *item)
在row行之前插入一行,项目只有一个
bool insertRow(int row, const QModelIndex &parent = QModelIndex())
用法参考列

2.8 根项目

QStandardItem * invisibleRootItem() const
它可以返回模型的隐藏根项目。

隐藏根项目是一个虚拟项目,它不显示在视图中。它是所有其他项目的父项目。可以使用它来管理模型中的所有项目。

隐藏根项目是QStandardItemModel中一个虚拟的项目,它不会在视图中显示,但是可以当作所有真实项目的根节点,可以使用它来管理模型中的所有项目.,可以使用它来插入、删除、获取项目,

如果在隐藏根项目下插入数据,视图中是可见的。因为虽然隐藏根项目本身不会在视图中显示,但它是所有项目的根节点,所有项目都是它的子项目。所以在隐藏根项目下插入数据,会在视图中显示。

在隐藏根项目之前插入数据,视图中是不可见的。因为隐藏根项目本身不会在视图中显示,所以在它之前插入的项目也不会显示。

2.9 item

QStandardItem * item(int row, int column = 0) const
它可以返回模型中指定行和列的项目。
row: 指定项目所在的行索引。
column: 指定项目所在的列索引。

请注意,如果指定的行或列超出了模型的范围,则此函数将返回 nullptr。
请注意,此函数不会创建新项目,如果在指定的位置没有项目,则返回nullptr

这个函数是很实用的,可以快速获取指定位置的项目

2.10 itemFromIndex

QStandardItem * itemFromIndex(const QModelIndex &index) const
它可以返回模型中指定QModelIndex对应的项目。
index: 指定项目的QModelIndex
例如:

QStandardItemModel* model = new QStandardItemModel(3, 3);
QModelIndex index = model->index(1, 1);
QStandardItem* item = model->itemFromIndex(index);

上面代码会返回模型中第2行第2列的项目。

请注意,如果指定的QModelIndex不存在或者无效,则此函数将返回 nullptr。
请注意,此函数不会创建新项目,如果在指定的位置没有项目,则返回nullptr

这个函数可以根据QModelIndex来获取项目,这个在一些视图的回调函数里可以使用。

2.11 项目原型

const QStandardItem * itemPrototype() const
它返回一个指向QStandardItem对象的常量指针,用于模型中新项目的初始化。

项目原型是一个QStandardItem对象,用来作为所有新项目的模板。当模型中需要新项目时,模型会复制项目原型并将其插入到模型中。

void QStandardItemModel::setItemPrototype(const QStandardItem *item)
它用来设置模型中新项目的初始化。
item: 指向QStandardItem对象的指针,用于新项目的初始化。

QStandardItemModel* model = new QStandardItemModel();
QStandardItem* prototype = new QStandardItem("Prototype");
model->setItemPrototype(prototype);

上面代码会设置项目原型为 "Prototype" 。

这样的话,每次需要新项目的时候,就不需要重新创建新的QStandardItem对象了,只需要复制项目原型并修改即可。这样可以提升效率,同时让代码更加简洁

例如:

QStandardItemModel* model = new QStandardItemModel();
QStandardItem* prototype = new QStandardItem("Prototype");
model->setItemPrototype(prototype);

for (int i = 0; i < 10; ++i) {
    QList<QStandardItem*> row;
    for (int j = 0; j < 3; ++j) {
        QStandardItem* item = model->itemPrototype()->clone();
        item->setText(QString("Item %1-%2").arg(i+1).arg(j+1));
        row.append(item);
    }
    model->appendRow(row);
}

上面的代码设置了项目原型为 "Prototype" ,每次需要新项目的时候,使用 clone() 方法来复制项目原型,然后在设置新的文本。这样可以保证项目原型的格式与样式都能保持一致。

这样就不用创建多个QStandardItem对象了,只用创建一个项目原型,复制多次,每次复制的项目都是一个独立的对象,都可以设置自己的文本,图标等属性。这样有利于节约内存和提高程序的运行效率。
项目原型一定要在填充数据前设置好,在填充数据中使用了原型才会生效

2.12 设置行数和列数

void setColumnCount(int columns)
设置列数
void setRowCount(int rows)
设置行数

virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override
返回列数

2.13 设置指定位置的项目

void setItem(int row, int column, QStandardItem *item)
void setItem(int row, QStandardItem *item)
它们都用于在模型中设置指定位置的项目。

setItem(int row, int column, QStandardItem *item)
row: 指定项目所在的行索引。
column: 指定项目所在的列索引。
item: 指向需要插入到指定位置的项目对象。

setItem(int row, QStandardItem *item)
row: 指定项目所在的行索引。
item: 指向需要插入到指定位置的项目对象。
这两个函数类似,区别在于第一个函数可以指定插入到指定的行和列上,第二个只能指定插入到指定的行上。

2.14 setItemRoleNames

void setItemRoleNames(const QHash<int, QByteArray> &roleNames)
它允许在模型中设置项目的角色名称.
roleNames: 是一个映射项目数据角色的哈希表到角色名称。

相当于给角色名称起了另一个名字,将角色的整型值映射为字符串,方便使用和维护

每个项目都有不同的角色,每个角色都有不同的数据。为了方便记录每一个角色的具体含义,Qt提供了setItemRoleNames函数来设置各个角色对应的名字.

QStandardItemModel *model = new QStandardItemModel();
QHash<int, QByteArray> roles;
roles[Qt::UserRole] = "name";
roles[Qt::DisplayRole] = "display";
model->setItemRoleNames(roles);

QStandardItem *item = new QStandardItem("John");
item->setData("John Smith", Qt::UserRole);
item->setData("John Smith", Qt::DisplayRole);
model->setItem(0, 0, item);

QModelIndex index = model->index(0, 0);
QVariant data = model->data(index, Qt::UserRole);

在setItemRoleNames中将Qt::UserRole映射到"name",就可以方便的记录Qt::UserRole的具体含义,而在使用时还是需要使用Qt::UserRole来获取对应的值。

2.15 排序角色

int sortRole() const
void setSortRole(int role)
sortRole()返回当前的排序角色。排序角色决定了模型的排序方式。默认情况下,排序角色为Qt::DisplayRole。

setSortRole(int role)方法用于设置排序角色。该方法允许您将模型的排序角色设置为任何角色。这允许您根据项目中任何数据来排序模型。比如说,当你在Qt::UserRole 角色上面设置了某个数值,而这个数值对应了时间顺序。就可以通过设置sortRole(Qt::UserRole),来将数据按照时间顺序来排序。

当排序角色更改时,模型将重新排序以反映新的角色。

3 虚函数

virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override
返回列数

virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
是一个虚函数,是在QAbstractItemModel的重载函数,它返回给定模型索引和角色的项目数据。
index: 代表数据所在的行和列的模型索引,如果索引不是有效的,函数会返回无效的QVariant
role: 项目数据的角色。默认情况下,此值为Qt::DisplayRole。不同的角色可能具有不同的数据。

virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
是一个虚函数,是在QAbstractItemModel的重载函数,它用于接受并放置从拖动和放置操作传递来的数据.

data:拖放的数据。
action:放置数据的操作。它可能是Qt::CopyAction或Qt::MoveAction
row:放置数据的目标行。
column:放置数据的目标列。
parent:放置数据的目标父级模型索引。
如果模型成功接受和处理了拖动放置的数据,则返回true。否则返回false

这个函数的默认实现会返回false, 表明不支持drop操作。支持drop操作,需要重载这个函数并自己处理drop操作。

举个例子, 当我们拖放文本文件到这个模型中时,我们可以在dropMimeData函数中重载,来读取放置的文件的内容并增加到模型中。

virtual Qt::ItemFlags flags(const QModelIndex &index) const override
是一个虚函数, 是在QAbstractItemModel的重载函数,用于返回指定索引的项目的标志.

index:要返回标志的索引。
返回值是一个Qt::ItemFlags类型的标志, 可以是一个或多个标志的组合, 比如:

  • Qt::ItemIsEnabled:项目是否可用
  • Qt::ItemIsSelectable:项目是否可以被选中
  • Qt::ItemIsEditable:项目是否可以被编辑
  • Qt::ItemIsUserCheckable:项目是否有可以被用户选择的checkbox
    这个函数的默认实现会返回Qt::ItemIsEnabled | Qt::ItemIsSelectable, 表示所有项目都可用和可选择.

可以在此函数中重载,来设置一些特定项目的标志, 例如,不允许一些项目被编辑.

virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const override
是一个虚函数, 是在QAbstractItemModel的重载函数,用于判断指定父级项目是否有子项目。

parent:要检查是否有子项目的父级项目索引。
返回值是一个bool类型, 如果父级项目有子项目,则返回true, 否则返回false。

这个函数的默认实现会检查给定索引的行和列值是否为0, 如果是, 则表示没有子项目,返回false, 否则返回true

通常用于树形视图中,在展开或折叠一个节点时使用, 来显示这个节点是否可以展开或折叠。

virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
是一个虚函数, 是在QAbstractItemModel的重载函数,用于获取表头的数据。

section:要获取数据的表头部分。
orientation:表头的方向。它可能是Qt::Horizontal或Qt::Vertical。
role:要获取的数据的角色。默认是Qt::DisplayRole。
返回值是一个QVariant类型的数据。

QStandardItemModel 默认实现返回QStandardItem对象的对应于指定的role的值.

如果是Qt::Horizontal的话, 返回的就是水平表头的值, 如果是Qt::Vertical的话, 返回的就是垂直表头的值.

这个函数可以在需要的时候重载,来自定义表头的显示。

virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
是一个虚函数, 是在QAbstractItemModel的重载函数,用于获取指定行和列的项目的索引。

row: 要获取索引的项目的行号。
column: 要获取索引的项目的列号。
parent: 要获取索引的项目的父级索引。
返回值是一个QModelIndex类型的对象。如果指定行列的项目不存在,则返回一个无效索引。

这个函数的默认实现会构造一个QModelIndex对象, 并使用给定的行列和父级索引来初始化它。

QModelIndex 是QAbstractItemModel中用于表示项目位置的类,它包含了行、列和父级索引等信息.

该函数用于根据行和列索引来获取项目的索引, 从而可以使用获取到的索引来获取项目的信息.

virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
是一个虚函数, 是在QAbstractItemModel中重载函数, 用于在指定父级项目的指定列号之前插入指定数量的列。

column:要插入列的位置。
count:要插入的列数。
parent:新列的父级项目索引。如果没有指定,则新列将成为隐藏根项目的子项。
返回值是一个bool类型的值,如果插入成功,返回true,否则返回false。

当使用这个函数来插入列时, 会自动在该列后面插入相应数量的空行, 对于该列的每一行的每一列都会插入一个QStandardItem对象.

注意插入的列数和列的编号从0开始算.

这个函数使用的场景是在QTableView中动态添加新的列, 使用起来需要注意参数的设置.
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
同上
virtual QMap<int, QVariant> itemData(const QModelIndex &index) const override
是一个虚函数,是在QAbstractItemModel中重载函数,用于获取指定项目的所有数据。

index: 指定项目的索引。
返回值是一个QMap<int, QVariant> 类型的对象,表示项目的数据。 QMap的键是角色,值是对应的数据。如果指定的项目不存在或者没有数据,则返回空的QMap。

这个函数返回指定项目的所有数据,每个角色都作为一个键,对应的数据作为值。

这个函数可以帮助我们在不同角色之间切换获取项目的数据, 也可以用来获取项目设置的多种不同类型的数据.

virtual QMimeData * mimeData(const QModelIndexList &indexes) const override
是一个虚函数,是在QAbstractItemModel中重载函数,用于创建一个QMimeData对象,其中包含给定索引列表中项目的数据。

indexes: 一个QModelIndexList对象,表示要获取数据的项目的索引。
返回值是一个QMimeData *类型的对象,表示项目的数据的MIME数据。
virtual QStringList mimeTypes() const override
是用来获取模型支持的MIME类型, 这个函数在Qt中被重载使用在拖拽/剪切粘贴上.

这两个函数主要是配合使用的,mimeTypes函数用于获取支持的MIME类型,mimeData函数用于创建MIME数据,在Qt中对于拖拽和剪切粘贴都会使用到这两个函数。

以上两个函数可以用来实现模型数据的拖拽剪切粘贴.

virtual QModelIndex parent(const QModelIndex &child) const override
是一个虚函数,是在QAbstractItemModel中重载函数,它返回给定索引所表示的项目的父项目。

child: 指定的项目索引。
返回值是给定索引所表示的项目的父项目的索引。

这个函数主要用于在模型中查找项目的父项目。

注意,如果给定索引是隐藏根项目,那么将返回一个无效索引。

virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
是一个虚函数,是在QAbstractItemModel中重载函数,用于删除模型中指定位置的一些列。

column:要删除的第一列的位置。
count:要删除的列数。
parent: 指定父项目的索引。
返回值是布尔类型的,表示是否删除成功。

virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
同上

virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
返回行数

virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
是一个虚函数,是在QAbstractItemModel中重载函数,用于修改模型中指定索引项目的数据。

index:修改数据的项目索引。
value:新的数据。
role: 数据的角色。
返回值是布尔类型的,表示是否修改成功。

这个函数会把指定索引位置的项目的对应角色设置为value。如果项目对应角色已经设置过,那么会更新数据.

注意:由于QStandardItemModel 继承QAbstractItemModel,所以在使用setData的时候要使用QStandardItem的setData来实现。

virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override
是一个虚函数,是在QAbstractItemModel中重载函数,用于修改模型中的表头的数据。

section: 要修改的表头的编号。
orientation: 表头的方向,可以是水平或垂直。
value: 新的数据。
role: 数据的角色。
返回值是布尔类型的,表示是否修改成功。

这个函数用来给指定编号和方向的表头设置对应角色的数据。如果这个表头已经设置过,会更新数据。

注意:QStandardItemModel 中表头是通过QStandardItem来实现的,所以修改表头需要使用对应的QStandardItem来设置

virtual bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles) override
是一个虚函数,是在QAbstractItemModel中重载函数,用于修改模型中指定索引项目的所有数据。

index: 修改数据的项目索引。
roles: 要修改的角色和数据的键值对。
返回值是布尔类型的,表示是否修改成功。

这个函数用来给指定索引位置的项目设置多个角色的数据。对于每个角色-数据键值对,都会调用setData来设置。

注意:由于QStandardItemModel 继承QAbstractItemModel,所以在使用setItemData的时候要使用QStandardItem的setData来实现。
virtual QModelIndex sibling(int row, int column, const QModelIndex &idx) const override
是一个虚函数,是在QAbstractItemModel中重载函数,用于在模型中查找具有相同父项目的索引。

row: 目标索引的行。
column: 目标索引的列。
idx: 原始索引。
返回值是QModelIndex类型的,表示目标索引。

该函数用于在指定的索引的同级节点中查找一个索引,可以用来查找同级兄弟节点,或者跨行跨列查找节点。

注意:如果行号和列号大于模型中存在的行列数,返回的是一个无效索引。
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override
是一个虚函数,是在QAbstractItemModel中重载函数,用于按照给定的顺序对指定列进行排序。

column: 要排序的列。
order: 排序的顺序,默认为升序。
该函数是一个基于Qt Model-View框架的模型的排序方法,用于对视图中的数据进行排序。可以设置排序的列和排序的顺序,默认是升序。 排序的数据来自data()函数的返回值,可以通过设置sortRole()来指定具体的角色来排序。

注意: 当使用QStandardItemModel作为模型时,使用sort函数进行排序操作时,需要在每一项中设置sortRole属性,不然会出现无法排序的结果。

virtual Qt::DropActions supportedDropActions() const override
是一个虚函数,是在QAbstractItemModel中重载函数,用于返回模型支持的拖放操作。

返回值是Qt::DropActions类型的枚举值,表示支持的拖放操作。

该函数是Qt Model-View框架中的一部分,用于获取模型支持的拖放操作,返回值是Qt::DropActions枚举值的组合,包括Qt::CopyAction,Qt::MoveAction和Qt::LinkAction。

Qt::CopyAction 表示支持复制。
Qt::MoveAction 表示支持移动。
Qt::LinkAction 表示支持链接。

在拖放事件中,支持的拖放操作将在放下时进行使用,它是由拖放源和接受拖放的接收者共同决定的。

4 信号

void itemChanged(QStandardItem *item)
当项目中的数据发生改变时触发。

参数 item 是项目中数据发生改变的项目指针。

当项目中的数据发生改变时,该信号将被发送,可以在接收该信号的槽函数中进行相应的处理。这对于在项目数据发生变化时进行自动更新和同步是非常有用的。

例如,在用户在编辑表格中的单元格时,需要更新某个状态或者进行某些操作,你就可以使用此信号。

5 角色名称解释

角色名称是一种用来表示项目数据中的信息类型的名称.
在Qt模型/视图系统中,QStandardItemModel提供了多种角色来存储项目的不同数据,比如: 文本数据,图标数据,状态数据等.
每种角色都用一个整数来标识,比如Qt::DisplayRole表示项目显示的文本数据,Qt::DecorationRole表示项目显示的图标数据。
使用角色名称来访问数据可以避免直接使用整数标识符来访问数据,因为这样可以使得代码更具可读性,对维护和调试更友好。

Qt支持多种角色,其中一些是内置的,另一些是用户可以定义的. 在Qt中,角色是一个整数常量。
内置的角色包括:

  • Qt::DisplayRole: 显示在视图中的文本。这是默认角色,如果没有指定角色,这个角色的数据会被使用。
  • Qt::DecorationRole: 用来显示图标或图片.
  • Qt::EditRole: 用于编辑项目的数据.
  • Qt::ToolTipRole: 显示工具提示.
  • Qt::StatusTipRole: 显示状态栏提示.
  • Qt::WhatsThisRole: 为“什么是这个?”提供信息.
  • Qt::SizeHintRole: 为每个项目设置大小.

用户可以定义的角色包括:

  • Qt::UserRole: 用户自定义角色的起点。可以使用这个角色以及更大的值来

文章转自博客园(m晴朗):Qt-QStandardItemModel - m晴朗 - 博客园

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

猜你喜欢

转载自blog.csdn.net/QtCompany/article/details/132069940
QT