QStandardItemModel详解
我希望这篇文章可以达到的效果是:关于表格,你需要的全在这。表格的组成、属性和操作,如何用代码实现,关于QStandardItemModel的功能和使用一目了然。
需求概述
从表格使用需求说起
我们想学习一个东西,首先需要知道它是什么,能做什么,从整体结构上认识和分解它,然后再学习它。否则学的都是零零散散的知识点,一转头就忘记了,很难有个全面的认识。
在学习QStandardItemModel之前,我们先一步步列出一个表格的组成、属性和操作。在Qt中,我们通常用QTableView来实现表格。由于QStandardItemModel可以直接绑定表格,所以了解了QTableView使用需求,也就了解了QStandardItemModel。
表格我们都很熟悉,平时用EXCEL表,潜意识就直接使用,但很可能没有好好的去总结过表格到底包括哪些东西,虽然简单,但需要编程时,想到的还是零碎的东西。
表格组成元素
- 表头,包括行表头和列表头(常用)
- 行和列
- 单元格
表格属性
- 行高和列宽
- 字体和颜色
- 底色
表格操作
- 读写单元格
- 添加行或列
- 删除行或列
- 选中行或列
- 复选框设置和判断
用户点击“添加”按钮时,在QTableView添加一行,光标闪烁在波长单元格,以提示输入波长值。右侧添加一个复选框,用户选中对应波长,以便实现进行对该波长的其他操作。
代码实现
在QTableView添加一行,光标闪烁在新添加行首列单元格
点击复选框,选中该行,并显示波长值
关于QTableView的基本操作
QTableView与QStandardItemModel绑定
二者绑定后,当在QTableView修改数据时,QStandardItemModel随之改变,反之亦然。
设置标题内容
添加新行
添加一个QStandardItem
添加多个QStandardItem
删除选中行
删除单行
model->removeRow(selectModel->currentIndex().row());
删除多行
要删除 QStandardItemModel 中的选中行,你可以使用 QItemSelectionModel 来获取选中行的索引,然后在模型中执行删除操作。
以下是一个示例,演示如何删除 QStandardItemModel 中的选中行:
QStandardItemModel* model = new QStandardItemModel(this);
// 添加一些项到模型中
QStandardItem* item1 = new QStandardItem("Item 1");
model->setItem(0, 0, item1);
QStandardItem* item2 = new QStandardItem("Item 2");
model->setItem(1, 0, item2);
QStandardItem* item3 = new QStandardItem("Item 3");
model->setItem(2, 0, item3);
// 创建 QTableView
QTableView* tableView = new QTableView;
tableView->setModel(model);
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);
tableView->show();
// 删除选中行
QItemSelectionModel* selectionModel = tableView->selectionModel();
QModelIndexList selectedIndexes = selectionModel->selectedRows();
// 倒序遍历选中的索引
for (int i = selectedIndexes.size() - 1; i >= 0; --i) {
QModelIndex selectedIndex = selectedIndexes.at(i);
model->removeRow(selectedIndex.row());
}
在上述示例中,我们首先创建了一个 QStandardItemModel 对象,并向模型中添加了一些项。然后,我们创建了一个 QTableView 视图,并将模型设置为视图的数据源。
我们还设置了视图的选择行为为选择整行,并启用了扩展选择模式,以便能够选择多行。
接下来,我们获取视图的 QItemSelectionModel 对象,并使用 selectedRows() 方法获取选中行的索引列表。然后,我们使用一个倒序循环遍历选中的索引,并在模型中使用 removeRow() 方法删除对应的行。
请注意,我们在示例中使用了倒序循环来删除选中的行,这是因为在删除行之后,索引会发生变化。通过倒序遍历可以避免出现索引错位的问题。
在实际应用中,你可以根据需要进行适当的调整,例如在删除行之前进行确认,或者根据特定条件删除行。