我刚刚开始学习QML,当我想从设置中读取ListModel时,我有点想知道该怎么做。
我的困境是:
1)如果我在C ++代码中定义模型我没有加载它的问题(我已经完成了类似的东西加载次数)但是我牺牲了实际编写(以及稍后更新)模型代码的时间,然后每次重新编译我需要这样做。
2)我的另一个想法是将设置文件读入QVariantMap的QList,并使用javascript在QML文件中创建读取此列表的模型。这样我只需要2个C ++函数,一个用于逐段读取文件,另一个用于写入。但正如我所说 - 我只是开始QML编程而不确定它是否理智或沮丧。
当需要动态QML ListModel时,有人可以对良好做法发表评论吗?
UPD :我似乎需要澄清这个问题:
如果这些东西很简单,可以从设置中读取,然后通过Javascript直接解析到ListModel,我是否还需要C ++数据模型?或者是否存在我不知道的陷阱,使C ++方式成为唯一合理的选择?
UPD2 经过一些研究后,我很想和LocalStorage一起去完全放弃c ++
答案 0 :(得分:1)
使现有的C ++模型可编辑是很容易的,因为你从Qt获得了所有东西。
您在.h
中有以下内容class MyModel : public QAbstractListModel
{
Q_OBJECT
public:
enum MyRoles {
SomeRole = Qt::UserRole,
// ...
}
// ...
bool setData(const QModelIndex &index, const QVariant &value, int role);
in .cpp
bool MyModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
switch (role) {
case SomeRole:
// your writer code
emit dataChanged(index, index, (QVector<int>(0) << SomeRole));
return true;
case SomeOtherRole:
// ...
return true;
default:
qCritical() << "MyModel.setData: Unknown role:" << role;
return false;
}
}
现在您可以使用QML内部来完成写入。
MyModelDelegate {
Button {
text: somerole
onClicked: {
// this will call setData with the correct row index and SomeRole
somerole = "some other value"
}
}
}
只有在添加新角色时才会重新编译此C ++代码,这种代码不应经常发生或写入方法已更改。