Qt6.6.0中带排序的QTableView如何选中新增记录行?
问题:启用排序的QSqlTableModel新增记录后,在QTableView中选中对应行
在Qt 6.6.0应用中,配置了启用排序的QSqlTableModel与QTableView:
QSqlTableModel *model; model = new QSqlTableModel(this, db); model->setTable("table"); model->setEditStrategy(QSqlTableModel::OnManualSubmit); model->sort(0, Qt::AscendingOrder); model->select(); ui->tableDb->setModel(model); // QTableView
通过以下方式添加记录:
QSqlRecord record = model->record(); record.setValue("col1", value1); // ... 赋值其他列 for (int i = 0; i < record.count(); i++) record.setGenerated(i, true); bool ret = true; ret &= model->insertRecord(-1, record); ret &= model->submitAll(); if (!ret) return false; ui->tableDb->selectRow(???); // 此处需要选中新增记录的行
由于启用了排序,新增记录在QTableView中的位置无法确定,需要通过模型索引获取其可视化位置并选中。
解决方案
核心思路是:提交记录后,通过模型的match方法找到新增记录对应的模型索引,再通过视图的选择模型(QItemSelectionModel)选中该行——而非直接使用selectRow(它依赖视图行号,排序后与模型原始行号不匹配)。
具体实现步骤
- 确定新增记录的唯一标识:选取表的主键列,或者新增记录中唯一的字段值(比如
value1)。 - 通过
match方法查找模型索引:在模型中匹配该唯一值,得到对应的模型索引。 - 使用选择模型选中该行:将模型索引传入选择模型,完成选中操作,可选同时滚动到该行确保可见。
代码示例
替换原有ui->tableDb->selectRow(???);部分为以下代码:
// 假设新增记录的col1字段值是唯一的,用它匹配 QModelIndexList indexes = model->match( model->index(0, model->fieldIndex("col1")), // 从col1列的第一行开始匹配 Qt::DisplayRole, value1, // 新增记录的col1值 1, // 只找第一个匹配项 Qt::MatchExactly // 精确匹配 ); if (!indexes.isEmpty()) { QModelIndex targetIndex = indexes.first(); // 选中该行(同时清除之前的选中状态) ui->tableDb->selectionModel()->clearSelection(); ui->tableDb->selectionModel()->select(targetIndex, QItemSelectionModel::Select | QItemSelectionModel::Rows); // 可选:滚动到该行,确保可见 ui->tableDb->scrollTo(targetIndex); }
补充说明
- 如果表有自增主键,提交后可以通过
record.value("主键列名")获取生成的主键值,再用该值进行匹配,这种方式比普通字段更可靠。 QItemSelectionModel::select方法会自动将模型索引映射到视图的正确位置,不受排序影响,这是解决问题的关键。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

