如何在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
相关产品推荐
相关产品推荐

