一、重要说明:
(1)QStandardItemModel是存储数据的模型;
(2) 控件是显示数据的,与用户交互;
(3)代理是作用在控件和数据模型之间,做控件和模型中的数据的交互,用户修改的数据会经过代理,代理然后将数据存放在数据模型中。用户不能直接操作数据。
(4)M/V结构实现了界面和数据的分离。
二、类属性
QStandardItemModel
类是 Qt框架中M/V结构的数据模型之一,它提供了一种通用的数据模型,用于存储和管理自定义数据。QStandardItemModel
采用了树型结构来存储数据,其中每一个节点对应一个QStandardItem
对象,每个对象都可以存储任何数据类型的数据。
三、控件选择
该类与 Qt 的视图类(如QListView
、QTableView
等)结合使用,以显示和操作数据,提供了一系列函数来管理数据,例如添加、删除、查找、修改行或列等...
四、相关函数
函数名称 | 函数原型 | 说明 |
---|---|---|
构造函数 | QStandardItemModel(qobject *parent = nullptr) QStandardItemModel(int rows, int columns, qobject *parent = nullptr) | 用于创建模型,并可指定行数和列数 |
添加一列 | appendColumn(const QList<QStandardItem *> &items) | 在模型的最后一列后面添加一列,并插入给定的项目列表 |
添加一行 | appendRow(const QList<QStandardItem *> &items) appendRow(QStandardItem *item) | 在模型的最后一行后面添加一行,并插入给定的项目或项目列表 |
清空 | clear() | 删除模型中的所有行和列,重置模型为空 |
查找 | findItems(const QString &text, Qt::MatchFlags flags = Qt::MatchExactly, int column = 0) const | 在模型中查找包含给定文本的项目 |
标头相关 | horizontalHeaderItem(int column) const | 返回指定列的水平表头项目 |
设置表头 | setHorizontalHeaderItem(int column, QStandardItem *item) | 设置指定列的水平表头项目 |
设置表头 | setHorizontalHeaderLabels(const QStringList &labels) | 设置水平表头的标签列表 |
获取行列 |
| 获取指定行和列的项目 通过索引获取项目 |
设置行列 | setItem(int row, int column, QStandardItem *item) | 设置指定行和列的项目 |
删除列 | takeColumn(int column) | 删除指定的列,并返回包含该列中所有项目的列表 |
设置行列 | setItem(int row, int column, QStandardItem *item) | 设置指定行和列的项目 |
删除标题 | takeHorizontalHeaderItem(int column) | 删除指定列的水平标题项目,并返回该项目的指针 |
删除行列 | takeItem(int row, int column = 0) | 删除指定行和列的项目,并返回该项目的指针 |
五、函数使用
a、【与QTableView控件关联显示】
QStandardItemModel model(4, 3); // 4 行 3 列
// 设置表头
model.setHorizontalHeaderLabels(QStringList() << "姓名" << "年龄" << "城市");
// 填充数据
model.setItem(0, 0, new QStandardItem("张三"));
model.setItem(0, 1, new QStandardItem("25"));
model.setItem(0, 2, new QStandardItem("北京"));
model.setItem(1, 0, new QStandardItem("李四"));
model.setItem(1, 1, new QStandardItem("30"));
model.setItem(1, 2, new QStandardItem("上海"));
model.setItem(2, 0, new QStandardItem("王五"));
model.setItem(2, 1, new QStandardItem("28"));
model.setItem(2, 2, new QStandardItem("广州"));
model.setItem(3, 0, new QStandardItem("赵六"));
model.setItem(3, 1, new QStandardItem("32"));
model.setItem(3, 2, new QStandardItem("深圳"));
QTableView view;
view.setModel(&model); //将数据模型和显示控件相结合起来
view.show();
b、【与QTreeView控件关联显示】
QTreeView *m_model;//创建控件对象
QStringList header;//创建数据模型
header << "姓名" << "性别" << "工号";
m_model->setHorizontalHeaderLabels(header);// 水平方向的表头
// 加一级节点
m_model->setItem(0, 0, new QStandardItem("研发部"));
// 加二级节点
m_model->item(0,0)->setChild(0, 0, new QStandardItem("系统研发部"));
// 加三级节点
m_model->item(0,0)->child(0,0)->setChild(0,0,new QStandardItem("张飞"));
m_model->item(0,0)->child(0,0)->setChild(0,1,new QStandardItem("男"));
m_model->item(0,0)->child(0,0)->setChild(0,2,new QStandardItem("20"));
// 加二级节点
m_model->item(0,0)->setChild(1, 0, new QStandardItem("应用研发部"));
// 加三级节点
m_model->item(0,0)->child(1,0)->setChild(0,0,new QStandardItem("关羽"));
m_model->item(0,0)->child(1,0)->setChild(0,1,new QStandardItem("男"));
m_model->item(0,0)->child(1,0)->setChild(0,2,new QStandardItem("22"));
// 加一级节点
m_model->setItem(1, 0, new QStandardItem("市场部"));
// 加二级节点
m_model->item(1,0)->setChild(0, 0, new QStandardItem("国内市场部"));
// 加三级节点
m_model->item(1,0)->child(0,0)->setChild(0,0,new QStandardItem("黄忠"));
m_model->item(1,0)->child(0,0)->setChild(0,1,new QStandardItem("男"));
m_model->item(1,0)->child(0,0)->setChild(0,2,new QStandardItem("40"));
// 加二级节点
m_model->item(1,0)->setChild(1, 0, new QStandardItem("国际市场部"));
// 加三级节点
m_model->item(1,0)->child(1,0)->setChild(0,0,new QStandardItem("孙权"));
m_model->item(1,0)->child(1,0)->setChild(0,1,new QStandardItem("男"));
m_model->item(1,0)->child(1,0)->setChild(0,2,new QStandardItem("25"));
ui->m_tree->setModel(m_model); // 模型和视图连接
ui->m_tree->expandAll();// 展开所有的节点
// 让表头自适应列宽
ui->m_tree->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
c、【动态加行】
// 设置表头
model.setHorizontalHeaderLabels(QStringList() << "课程" << "分数");
// 动态添加行
QStandardItem *item1 = new QStandardItem("数学");
QStandardItem *item2 = new QStandardItem("90");
model.appendRow(QList<QStandardItem*>() << item1 << item2);
QStandardItem *item3 = new QStandardItem("英语");
QStandardItem *item4 = new QStandardItem("85");
model.appendRow(QList<QStandardItem*>() << item3 << item4);
QTableView view;
view.setModel(&model);
view.show();
d、【查找和修改数据】
QStandardItemModel model(3, 2);
model.setHorizontalHeaderLabels(QStringList() << "水果" << "数量");
model.setItem(0, 0, new QStandardItem("苹果"));
model.setItem(0, 1, new QStandardItem("10"));
model.setItem(1, 0, new QStandardItem("香蕉"));
model.setItem(1, 1, new QStandardItem("15"));
model.setItem(2, 0, new QStandardItem("橙子"));
model.setItem(2, 1, new QStandardItem("20"));
// 查找并修改数据
QList<QStandardItem*> items = model.findItems("香蕉");
if (!items.isEmpty()) {
items.first()->setData("20", Qt::EditRole);
}
QTableView view;
view.setModel(&model);
view.show();