首页| 论坛| 消息

标题:C++中如何调用QML中listmodel的append函数
作者:三只小鸡
日期:2020-06-15 19:33
内容:

ListModel{
id: boardModel
}
Component.onCompleted: {
CHub.initProjectInfo(boardModel)
}上面代码中我在qml的一个界面中我新建了一个listModel,界面Component.onCompleted 时跳到C++函数中void CHub::initProjectInfo(QObject *projectUI)
{
QStringList lstName;
CProjectManage projectManage;
projectManage.getAllProjectInfo(lstName); //获取工程名链表
for(int i = 0; i < lstName.count(); i++)
{
QMetaObject::invokeMethod(projectUI, "append", Q_ARG(QVariant, lstName.at(i))); //这里我想使用append函数给listModel添加子项
}
}我想使用append函数给listModel添加子项,但是不知道怎么弄,append的参数是jsobject dict,我要怎么做呢???


#1 [lemonzll 06-17 14:29]
按这里的说明https://doc.qt.io/qt-5/qtqml-cppintegration-data.html#qvariantlist-and-qvariantmap-to-javascript-array-and-object,正常应该传QVariantMap就行了。我试了下不行,提示是这个:
QMetaObject::invokeMethod: No such method QQmlListModel_QML_6::append(QVariant)
Candidates are:
append(QQmlV4Function*)也就是这里的append函数参数不是个js的object,所以得换下了。例如ListModel你需要的是两个字段,name和desc,就这样改下qml:
ListModel {
id: listModel

function appendItem(item) {
append({name: item.name, desc: item.desc});
}
}这样,调用appendItem来实现插入就可以了。
QVariantMap map;
map.insert("name", "Element 1");
map.insert("desc", "Desc 1");
QMetaObject::invokeMethod(model, "appendItem", Q_ARG(QVariant, QVariant::fromValue(map)));这种用个js函数封装一下的方式可以。或者你可以完全不用ListModel,直接model全用C++实现,直接继承QAbstractListModel,在C++里面实现所有的操作,然后把这个model赋值给ListView的model。
#2 回 lemonzll 的帖子 [三只小鸡 06-18 08:28]
lemonzll:按这里的说明https://doc.qt.io/qt-5/qtqml-cppintegration-data.html#qvariantlist-and-qvariantmap-to-javascript-array-and-object,正常应该传QVariantMap就行了。我试了下不行,提示是这个:
QMetaObject::invokeMethod: No such method QQmlListModel_QML_6::append(QVarian ..(2020-06-17 14:29)
感谢指导

回复 发表
主题 版块