QAbstractListModel子类调用begin/endInsertRows后未触发dataChanged信号怎么办
问题解答
核心原因
QAbstractListModel 对不同的数据操作会触发不同的内置信号,新增行操作不会触发dataChanged信号,这是Qt模型视图框架的标准设计:
dataChanged仅适用于已存在的行数据发生修改的场景,比如你更新了某一行已有数据的字段,才需要手动发射该信号rowsInserted才是新增行对应的信号,你调用endInsertRows()时系统会自动发射该信号,不需要手动处理- 删除行、移动行等操作也都对应各自独立的信号,互不交叉
你之前的问题本质是监听了错误的信号,才会没有日志输出,手动发射dataChanged属于不符合规范的冗余操作,还可能导致视图做多余的刷新,不建议这么写。
正确实现方案
如果你需要监听新增行的动作,把QML中Connections的监听对象改为rowsInserted信号即可:
Connections { target: main.custom_model function onRowsInserted(parent, first, last) { console.log("Custom model inserted new rows, row range: ", first, "~", last) } }
如果你的业务逻辑需要监听所有类型的数据变更(新增、修改、删除),可以在QML的Connections中给多个信号绑定同一个处理函数,也可以在Python的模型子类中把几个内置信号都关联到同一个自定义信号上集中处理。
内容的提问来源于stack exchange,提问作者maldata
相关产品推荐
相关产品推荐

