• 3690阅读
  • 2回复

[提问]C++中如何调用QML中listmodel的append函数 [复制链接]

上一主题 下一主题
离线三只小鸡
 

只看楼主 倒序阅读 楼主  发表于: 2020-06-15
  1. ListModel{
  2.         id: boardModel
  3.     }
  4.     Component.onCompleted: {
  5.         CHub.initProjectInfo(boardModel)
  6.     }
上面代码中我在qml的一个界面中我新建了一个listModel,界面Component.onCompleted 时跳到C++函数中
  1. void CHub::initProjectInfo(QObject *projectUI)
  2. {
  3.    QStringList lstName;
  4.    CProjectManage projectManage;
  5.    projectManage.getAllProjectInfo(lstName); //获取工程名链表
  6.    for(int i = 0; i < lstName.count(); i++)
  7.    {
  8.        QMetaObject::invokeMethod(projectUI, "append", Q_ARG(QVariant, lstName.at(i))); //这里我想使用append函数给listModel添加子项
  9.    }
  10. }
我想使用append函数给listModel添加子项,但是不知道怎么弄,append的参数是jsobject dict,我要怎么做呢???

离线lemonzll

只看该作者 1楼 发表于: 2020-06-17
按这里的说明https://doc.qt.io/qt-5/qtqml-cppintegration-data.html#qvariantlist-and-qvariantmap-to-javascript-array-and-object,正常应该传QVariantMap就行了。我试了下不行,提示是这个:
  1. QMetaObject::invokeMethod: No such method QQmlListModel_QML_6::append(QVariant)
  2. Candidates are:
  3.     append(QQmlV4Function*)
也就是这里的append函数参数不是个js的object,所以得换下了。例如ListModel你需要的是两个字段,name和desc,就这样改下qml:
  1. ListModel {
  2.         id: listModel
  3.         function appendItem(item) {
  4.             append({name: item.name, desc: item.desc});
  5.         }
  6. }
这样,调用appendItem来实现插入就可以了。
  1. QVariantMap map;
  2. map.insert("name", "Element 1");
  3. map.insert("desc", "Desc 1");
  4. QMetaObject::invokeMethod(model, "appendItem", Q_ARG(QVariant, QVariant::fromValue(map)));
这种用个js函数封装一下的方式可以。或者你可以完全不用ListModel,直接model全用C++实现,直接继承QAbstractListModel,在C++里面实现所有的操作,然后把这个model赋值给ListView的model。

离线三只小鸡

只看该作者 2楼 发表于: 2020-06-18
回 lemonzll 的帖子
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) 

感谢指导
快速回复
限100 字节
 
上一个 下一个