QML ListModel文件的读/写和良好实践

时间:2014-11-04 00:51:17

标签: qt design-patterns qml

我刚刚开始学习QML,当我想从设置中读取ListModel时,我有点想知道该怎么做。

我的困境是:

1)如果我在C ++代码中定义模型我没有加载它的问题(我已经完成了类似的东西加载次数)但是我牺牲了实际编写(以及稍后更新)模型代码的时间,然后每次重新编译我需要这样做。

2)我的另一个想法是将设置文件读入QVariantMap的QList,并使用javascript在QML文件中创建读取此列表的模型。这样我只需要2个C ++函数,一个用于逐段读取文件,另一个用于写入。但正如我所说 - 我只是开始QML编程而不确定它是否理智或沮丧。

当需要动态QML ListModel时,有人可以对良好做法发表评论吗?

UPD :我似乎需要澄清这个问题:

如果这些东西很简单,可以从设置中读取,然后通过Javascript直接解析到ListModel,我是否还需要C ++数据模型?或者是否存在我不知道的陷阱,使C ++方式成为唯一合理的选择?

UPD2 经过一些研究后,我很想和LocalStorage一起去完全放弃c ++

1 个答案:

答案 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 ++代码,这种代码不应经常发生或写入方法已更改。