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

如何在C++中为QML ListView实例的model属性赋值

问题解决方案

错误原因

QVariant无法直接隐式转换栈上的QAbstractListModel子类实例,且QML的model属性实际接受的是QAbstractItemModel*类型指针,栈对象若脱离作用域会被销毁,还会导致QML侧访问无效对象。

正确实现方式

步骤1:改用堆分配模型对象

将栈上的MyListViewModel实例改为堆分配,借助Qt父子对象机制自动管理内存(传入this作为父对象):

MyListViewModel *lv = new MyListViewModel("myListViewModel", this);
lv->addAttribute({tr("Cycle"), 0, true, true});
lv->addAttribute({tr("Analogue"), 1, false, true});
lv->addAttribute({tr("Calculations"), 2, false, true});

步骤2:通过QVariant::fromValue传递模型指针

使用QVariant::fromValue将模型指针转换为QVariant,再赋值给ListView的model属性:

listViewItem->setProperty("model", QVariant::fromValue(lv));

额外注意事项

  • 确保MyListViewModel类声明中包含Q_OBJECT宏,且已运行qmake生成moc文件,保证Qt元对象系统能识别该类。
  • 若需要更明确的类型转换,可将指针转为基类指针后再传入:
    listViewItem->setProperty("model", QVariant::fromValue(static_cast<QAbstractListModel*>(lv)));
    

内容的提问来源于stack exchange,提问作者Artur Mangus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:51:01