Qt中视图自动绑定currentRowChanged至submit()的设计合理性问询
Qt 6.3.1中视图自动连接currentRowChanged到submit()的设计疑问
问题背景
在Qt 6.3.1应用中,自研模型出现submit()方法被频繁调用的情况。调试发现:
QTableView::setSelectionModel()/QTreeView::setSelectionModel()函数会自动将selectionModel的currentRowChanged信号连接到model的submit()槽,源码注释标注为「支持行编辑」QAbstractItemModel文档说明submit()通常用于行编辑,证实这是Qt的有意设计
开发者的三点疑问:
- 视图未提供属性阻止该连接,此行为属于强制而非可选默认;
- 该行为仅能通过查看Qt源码得知,开发者更倾向于按需自行创建连接;
- 仅
QSqlTableModel拥有editStrategy机制处理该逻辑,QAbstractItemModel与QAbstractTableModel均无相关机制。
最终询问:这种强制创建连接的设计有何合理原因?或是自己误解了该设计?
设计合理性与疑问解答
这种强制连接的设计,本质是Qt为行编辑场景提供的默认行为简化,核心原因有两点:
- 对齐文档约定:
QAbstractItemModel的文档明确submit()用于提交行级编辑结果,视图自动连接是把这个约定落地——当用户切换行时,自动提交当前行的编辑内容,避免编辑内容丢失或跨行干扰,这是大多数表格/树状编辑场景的通用需求。 - 适配SQL模型的设计惯性:
QSqlTableModel的editStrategy是这套逻辑的典型实现,Qt把这个通用行为下沉到视图层,让所有继承自QAbstractItemModel的模型都能默认享受到行编辑的基础提交能力,无需开发者重复编写连接逻辑。
针对你的疑问补充说明:
- 关于“无开关属性”:Qt的设计思路里,这种基础行为是默认提供的,若不需要,开发者可以在调用
setSelectionModel()后手动断开连接:
这是官方认可的自定义方式。disconnect(selectionModel(), &QItemSelectionModel::currentRowChanged, model(), &QAbstractItemModel::submit); - 关于“仅源码可见”:确实这个细节未在视图类的公开文档中明确说明,属于框架内部的默认行为实现,但逻辑上和
QAbstractItemModel对submit()的功能定义一致,算是文档覆盖的盲区。 - 关于“仅SQL模型有策略”:
QAbstractItemModel作为基类,只定义了submit()的接口规范,具体的提交逻辑需要子类自行实现——如果你不需要默认的提交触发,要么手动断开连接,要么在自研模型的submit()中做空实现或逻辑判断,避免不必要的调用。
你并没有误解设计,只是这套默认行为更偏向Qt预设的通用编辑场景,对于特殊需求的自研模型,需要手动调整连接逻辑。
内容的提问来源于stack exchange,提问作者Atmo
相关产品推荐
相关产品推荐

