我刚刚开始学习QML,当我想从设置中阅读ListModel时,我有点不知所措。
我的困境是:
1)如果我在C++代码中定义了模型,我在加载它时没有问题(我已经做了类似的工作很多次了),但是我牺牲了我的时间来实际编写(然后更新)模型代码,然后每次我需要重新编译它。
2)另一种思路是将设置文件读取到QList of QVariantMap中,并在QVariantMap文件中创建模型,使用javascript读取该列表。这样,我只需要2个C++函数,一个逐段读取文件,一个写入文件。但正如我所说-我只是刚开始QML编程,不确定它是理智的还是气馁的。
当一个人需要动态QML ListModel时,有人能对良好实践发表评论吗?
UPD:我似乎需要澄清这个问题:
如果内容足够简单,可以从设置中读取,然后通过Javascript直接解析到ListModel,那么我甚至需要使用ListModel数据模型吗?或者,我还没有意识到,C++方式是唯一合理的选择吗?
UPD2在做了一些研究之后,我很想和LocalStorage一起去,完全放弃c++
发布于 2014-11-04 10:04:14
使现有的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);
在.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++代码,这种情况不应该经常发生,或者编写方法会更改。
https://stackoverflow.com/questions/26726001
复制相似问题