You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(它依赖视图行号,排序后与模型原始行号不匹配)。

具体实现步骤

  1. 确定新增记录的唯一标识:选取表的主键列,或者新增记录中唯一的字段值(比如value1)。
  2. 通过match方法查找模型索引:在模型中匹配该唯一值,得到对应的模型索引。
  3. 使用选择模型选中该行:将模型索引传入选择模型,完成选中操作,可选同时滚动到该行确保可见。

代码示例

替换原有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 00:53:11