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

Qt6 QML TreeView获取选中项的QModelIndex方法问询

解决Qt6.4中QML TreeView点击项传递有效QModelIndex到C++的方案

核心思路

QML里TreeView的currentIndex属于视图层面索引,要转换成模型自身可用的QModelIndex,可以借助Qt6新增的模型方法直接转换,或是传递构造索引所需的核心参数到C++,再在C++端构建有效索引。

具体实现方法

方法一:使用模型的mapFromView方法(推荐)

Qt6为QAbstractItemModel新增了mapFromView方法,能直接将视图索引转换为模型层面的QModelIndex。

  1. C++模型添加处理槽函数
    在你的myModel类中添加槽函数,接收转换后的模型索引:
class myModel : public QAbstractItemModel
{
    Q_OBJECT
public slots:
    void onItemClicked(const QModelIndex& index)
    {
        if (index.isValid()) {
            // 这里编写点击后的业务逻辑,index是模型层面的有效索引
            qDebug() << "点击项的数据:" << index.data();
        }
    }
};
  1. QML中完成索引转换与调用
    在TreeView的点击信号中,调用模型的转换方法,再把结果传给C++槽:
TreeView {
    id: treeView
    model: myModel

    onClicked: {
        let modelIndex = myModel.mapFromView(currentIndex);
        myModel.onItemClicked(modelIndex);
    }

    // 此处配置TreeView的列、委托等其他属性
}

方法二:传递row与父索引参数到C++构造索引

如果mapFromView不适用场景,可传递项的行号和模型层面的父索引到C++,再手动构造有效索引。

  1. C++模型添加接收参数的槽函数
public slots:
    void onItemClicked(int row, const QModelIndex& parentIndex)
    {
        QModelIndex index = this->index(row, 0, parentIndex);
        if (index.isValid()) {
            // 编写后续处理逻辑
        }
    }
}
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:50:22