首页 > 解决方案 > 使用 createComponent 动态创建 QML 对象

问题描述

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

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

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

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

Qt 和 QML 甚至可以做到这一点吗?

编辑:

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

标签: c++qtuser-interfaceqml

解决方案


实现此目的的一种简单方法是子类化QAbstractListModel以创建自己EmployesListModel的 .csv 文件,解析您的 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) }
}


推荐阅读