Kon*_*kin 10 javascript runtime qml qt5
当我需要在运行时创建任何QML组件时,我可以使用该指南:http: //qt-project.org/doc/qt-5/qtqml-javascript-dynamicobjectcreation.html
即只需调用Qt.createComponent和component.createObject
但我找不到如何在运行时创建ListModel?用qml,而不是用c ++.
你可以问,为什么我需要它.所以,我有一个嵌套的ListModel:有外部模型,它委托包含的内部模型.因此,当我调用outer_model.append({})时,我必须为内部模型传递新创建的ListModel .我不能在外部委托中使用静态定义的内部模型,因为我无法在运行时访问此类模型.顺便说一句,可以以某种方式访问它吗?
PS也许在javascript中尝试管理模型是完全错误的想法?
isl*_*hul 11
我是一名编写QtQuick应用程序的JS开发人员,这是我尝试过的多种解决方案.
在QML中管理JavaScript模型的简短回答是,这是一场噩梦.我建议你编写一个QAbstractListModel的小子类,它在内部使用QJsonArray作为它的数据源,这样就可以更容易地理解C++中的数据结构以及它在QML中的用法.按照说明在此处从C++创建QML类型.
如果您仍想在JavaScript中执行此操作,则另一种方法如下:
function createNewList() {
var newListModel = Qt.createQmlObject('import QtQuick 2.2; \
ListModel {}', parent);
return newListModel;
}
Run Code Online (Sandbox Code Playgroud)
但是,即使使用gc()后,这也存在严重的内存泄漏问题
如果你主要关心的是ListModel里面有ListModel,那么下面这个简单的东西对我有用(我认为ListModels中的对象数组和ListModels之间存在隐式类型转换)
property ListModel items: ListModel {}
function addComplexItem() {
items.append({
"key": "People",
"arr": [
{
"arrItemName": "John",
"arrItemValue": 18,
},
{
"arrItemName": "Kerry",
"arrItemValue": 21,
},
{
"arrItemName": "Mike",
"arrItemValue": 19,
}
]});
}
// Usage
Component {
id: viewDelegate
Item {
Text {
text: "List of " + key
}
ListView {
model: arr
delegate: Rectangle {
Text {
text: arrItemName
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
试试这个:
Component {
id: someComponent
ListModel {
}
}
function createModel(parent) {
var newModel = someComponent.createObject(parent);
return newModel;
}
Run Code Online (Sandbox Code Playgroud)