【问题标题】:Using createComponent to dynamically create QML objects使用 createComponent 动态创建 QML 对象
【发布时间】:2019-08-24 19:39:26
【问题描述】:

在我的 C++ 程序中,我希望能够在运行时加载一个文件,其中包含多个员工的数据(名字、姓氏、出生日期)。该文件应该被解释并为每个员工创建 Employee 对象,并存储在某种列表中(可能是 QList?)。

在 QML 方面,我有一个“employee.qml”文件,它本质上是一个包含一些文本字段的矩形。

创建 Employee 对象后,我还想创建 'employee.qml' 组件的实例,并将每个实例绑定到其各自的 Employee 对象,以便文本字段反映 C++ 对象中的数据。

实际上,对于每个 Employee 对象,应该在屏幕上放置一个新组件,并绑定到正确的对象。它还应该能够调用类中定义的公共槽方法。

Qt 和 QML 是否也能做到这一点?

编辑:

一种可能的想法是在 C++ 中使用 QQmlComponent::create(),使用 SetProperty() 将 id 设置为 C++ 对象的名称,然后使用 setContextProperty 使该对象可用于 QML。

【问题讨论】:

标签: c++ qt user-interface qml


【解决方案1】:

实现此目的的一种简单方法是将QAbstractListModel 子类化以创建您自己的EmployesListModel,解析您的csv 文件等,并将其公开给QML,您可以在其中使用Repeater。最终的 QML 代码应如下所示:

EmployeesListModel
{
    id: employeesListModel
    source: "/path/to/employees.csv"
}

Repeater
{
    model: employeesListModel
    delegate: Text { text: "Hi, my name is %1 and i am %2 years old".arg(employeeName).arg(employeeAge) }
}

【讨论】:

  • 但是如何将它绑定到存储在我的模型中的 C++ 对象?
  • 委托的每个实例都已绑定到模型中的相应行/对象。我更新了代码示例,以使用 employeeNameemployeeAge 之类的角色显示委托 - 这些角色应该由模型公开。或者,您可以将整个 QObject 公开为单个角色,并直接与 QML 中的属性进行交互
  • @谢谢,我会试一试。在定位“employee.qml”的实例方面,如果我将 x,y 坐标存储在我的 Employee 对象中,我如何在 QML 端使用它们将对象放置在指定的位置?
猜你喜欢
  • 2019-03-25
  • 2017-12-10
  • 2014-12-22
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多