QStandardItemModel中每个项是否对应唯一QModelIndex及获取方法问询
QStandardItemModel中区分同名子项的优雅方案
问题描述
我有一个结构如下的QStandardItemModel:
- USA
- Population
- Capital city
- France
- Population
- Capital city
触发doubleClicked信号时,通过QModelIndex::data()只能获取到项的文本(比如双击"Population"返回"Population"),无法直接区分它属于USA还是France。想找比多次调用model_index.parent()更优雅的方案,理想是实现一个如下的函数:
def get_standard_item(model: QStandardItemModel, index: QModelIndex) -> QStandardItem: ...
另外补充提问:在QModelIndex文档中看到internalId()返回模型关联索引与内部数据结构的quintptr值,能否用这个方法获取对应的QStandardItem?
优雅解决方案:直接获取QStandardItem
QStandardItemModel本身就提供了直接从QModelIndex获取对应QStandardItem的官方方法,完全不需要递归调用父项或者依赖内部ID,轻松实现你想要的函数:
Python实现
def get_standard_item(model: QStandardItemModel, index: QModelIndex) -> QStandardItem: if model and index.isValid(): return model.itemFromIndex(index) return None
拿到QStandardItem后,直接调用其parent()方法就能获取父项,进而区分所属的国家:
item = get_standard_item(model, clicked_index) if item: parent_item = item.parent() if parent_item: country = parent_item.text() print(f"{item.text()} 隶属于 {country}")
C++对应实现(若需)
如果是C++开发场景,写法类似:
QStandardItem* getStandardItem(QStandardItemModel* model, const QModelIndex& index) { if (model && index.isValid()) { return model->itemFromIndex(index); } return nullptr; }
关于internalId()的说明
不推荐使用internalId()来获取QStandardItem,原因如下:
internalId()是Qt模型的内部实现细节,不同版本或不同模型的逻辑可能存在差异,依赖它会导致代码兼容性变差。QStandardItemModel已经提供了itemFromIndex()这种安全、官方的方法,完全没必要使用非公开的内部接口。
内容的提问来源于stack exchange,提问作者DJames
相关产品推荐
相关产品推荐

