Qt 如何将动态创建的对象添加到容器中

Qt 如何将动态创建的对象添加到容器中,qt,qml,qt5,Qt,Qml,Qt5,我正在尝试动态创建ListModels,并将这些ListModels插入到容器中 我从后端系统获得了数量可变的列表模型,每个模型都有可变的内容。根据用户与GUI的交互,需要将其中一个ListModel加载到已知的ListView中。客户机希望避免使用Qt/C++,因此我希望通过QML解决这个问题 如何将动态创建的对象(在我的示例中是ListModel)放入容器中?此代码不起作用: property string strID; property string strName; Con

我正在尝试动态创建ListModels,并将这些ListModels插入到容器中

我从后端系统获得了数量可变的列表模型,每个模型都有可变的内容。根据用户与GUI的交互,需要将其中一个ListModel加载到已知的ListView中。客户机希望避免使用Qt/C++,因此我希望通过QML解决这个问题

如何将动态创建的对象(在我的示例中是ListModel)放入容器中?此代码不起作用:

  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),但不知道该使用什么语法。这非常有效!