Qt6 QML TreeView获取选中项的QModelIndex方法问询
解决Qt6.4中QML TreeView点击项传递有效QModelIndex到C++的方案
核心思路
QML里TreeView的currentIndex属于视图层面索引,要转换成模型自身可用的QModelIndex,可以借助Qt6新增的模型方法直接转换,或是传递构造索引所需的核心参数到C++,再在C++端构建有效索引。
具体实现方法
方法一:使用模型的mapFromView方法(推荐)
Qt6为QAbstractItemModel新增了mapFromView方法,能直接将视图索引转换为模型层面的QModelIndex。
- C++模型添加处理槽函数
在你的myModel类中添加槽函数,接收转换后的模型索引:
class myModel : public QAbstractItemModel { Q_OBJECT public slots: void onItemClicked(const QModelIndex& index) { if (index.isValid()) { // 这里编写点击后的业务逻辑,index是模型层面的有效索引 qDebug() << "点击项的数据:" << index.data(); } } };
- QML中完成索引转换与调用
在TreeView的点击信号中,调用模型的转换方法,再把结果传给C++槽:
TreeView { id: treeView model: myModel onClicked: { let modelIndex = myModel.mapFromView(currentIndex); myModel.onItemClicked(modelIndex); } // 此处配置TreeView的列、委托等其他属性 }
方法二:传递row与父索引参数到C++构造索引
如果mapFromView不适用场景,可传递项的行号和模型层面的父索引到C++,再手动构造有效索引。
- C++模型添加接收参数的槽函数
public slots: void onItemClicked(int row, const QModelIndex& parentIndex) { QModelIndex index = this->index(row, 0, parentIndex); if (index.isValid()) { // 编写后续处理逻辑 } } }
- QML中获取父模型索引并传递
通过模型的index方法,从视图父索引中推导模型层面的父索引:
TreeView { id: treeView model: myModel onClicked: { let parentModelIndex = myModel.index(currentIndex.parent.row, 0, currentIndex.parent.parent); myModel.onItemClicked(currentIndex.row, parentModelIndex); } }
注意事项
- 确保
myModel已通过setContextProperty或qmlRegisterType方式暴露给QML环境。 - 若使用自定义数据角色,可在C++槽函数中通过
index.data(自定义角色枚举)获取对应数据。
内容的提问来源于stack exchange,提问作者Money
相关产品推荐
相关产品推荐

