Qt 如何将动态创建的对象添加到容器中
我正在尝试动态创建ListModels,并将这些ListModels插入到容器中 我从后端系统获得了数量可变的列表模型,每个模型都有可变的内容。根据用户与GUI的交互,需要将其中一个ListModel加载到已知的ListView中。客户机希望避免使用Qt/C++,因此我希望通过QML解决这个问题 如何将动态创建的对象(在我的示例中是ListModel)放入容器中?此代码不起作用:Qt 如何将动态创建的对象添加到容器中,qt,qml,qt5,Qt,Qml,Qt5,我正在尝试动态创建ListModels,并将这些ListModels插入到容器中 我从后端系统获得了数量可变的列表模型,每个模型都有可变的内容。根据用户与GUI的交互,需要将其中一个ListModel加载到已知的ListView中。客户机希望避免使用Qt/C++,因此我希望通过QML解决这个问题 如何将动态创建的对象(在我的示例中是ListModel)放入容器中?此代码不起作用: property string strID; property string strName; Con
property string strID;
property string strName;
Container {
id: functionListContainer;
}
// create ListModel
var newObject = Qt.createQmlObject("import QtQml.Models 2.14; ListModel { }", mainWindow);
...
// dynamically append elements into the ListModel
newObject.append({ deviceID: strID, deviceName: strName })
...
// add ListModel to Container
functionListContainer.addItem(newObject);
createQmlObject
和append
似乎按预期工作。我在运行上面的addItem
code时遇到此错误:
“无法在转换参数0”
...
“通过JavaScript传递C++函数的不兼容参数是危险和不赞成的。”
“这将在Qt的未来版本中引发JavaScript类型错误!”
你知道如何让它工作吗?我知道addItem需要的是一个项,而不是一个对象,但我不知道如何让它工作。我尝试用属性项newItem
和属性QtObject newObject
[与addItem(newObject.Item)
]组合使用来替换var
,所有错误都给出(似乎相同)。将对象强制转换为项目是一个简单的问题吗?如果是,需要使用什么语法
最后,假设我有一个包含N个ListModels的容器,是否可以在ListView中直接引用该容器?i、 e:
property int idx;
Container {
id: functionListContainer;
}
// add ListModels to container...
// use ListModel inside container
ListView {
...
model: functionListContainer.itemAt(idx);
...
}
我知道ListView需要一个ListModel或类似的东西。但我不确定如何将ListView与包含ListModels的容器连接起来,或者是否可能
如果我要总结我的问题,我会尝试让ListView根据上下文显示不同的ListModels,并且我会尽可能在纯QML框架内完成这项工作。我上面的两个问题都与此有关。即使只是澄清这不是一个选项,并且有必要使用另一种方法,如清除和填充ListModel(欢迎建议)。您正在尝试添加
QObject
(因为ListModel
是从QAbstractListModel
继承而来的,而QObject又是从QObject
继承而来的)使用addItem
函数作为可视项。然而,在QML中QObject
(或QObject
)被视为“存储元素”
要执行的操作添加容器的contentData
:
Container {
id: functionListContainer
}
// create ListModel
var newObject = Qt.createQmlObject("import QtQml.Models 2.14; ListModel { }", mainWindow);
...
// dynamically append elements into the ListModel
newObject.append({ deviceID: strID, deviceName: strName })
...
// add ListModel to Container
functionListContainer.contentData.push(newObject)
contentData
属性是所有子项都位于Container
;QObject
和QQuickItem
(请注意,QQuickItem
继承自QObject
)
关于引用列表,当使用contentData
属性时,这也变得很容易:
// create ListModel
var newObject = Qt.createQmlObject("import QtQml.Models 2.14; ListModel { objectName: \"the_list\" }", mainWindow);
...
// add ListModel to Container
functionListContainer.contentData.push(newObject)
console.log(functionListContainer.contentData[0])
将产生:
qml: QQmlListModel(0x55bcb7119720, "the_list")
请注意,这与使用Javascript数组几乎相同,后者是QQmlListProperty的文档(这就是contentData
)如果你已经从C++获得了模型,为什么不采取额外的步骤,并将它们作为QAcExcTimeMod提供?看起来这将极大地改善代码结构,使其可以引用索引并将它们分配给<代码> ListVIEW < /C>。如果不想这样做,可以将属性添加到<代码>函数中。onListContainer
(javascript数组)谢谢他们的建议。听起来像QuaCurtMeTimes是一个很好的选择。但是,我们试图尽量避免C++由于特定的客户驱动的维护问题,所以这不是一个选项。我刚刚更新了我的问题,根据您的输入。JavaScript数组是我的第二个选项,我现在它可以工作了。我想知道是否有一种方法可以让它与容器一起工作,并且我不能让它工作的唯一原因是我缺乏关于QML语法的知识。有太多东西没有明确记录。谢谢!我希望语法允许它工作。我已经阅读了有关contentData的内容(和contentModel),但不知道该使用什么语法。这非常有效!