QML:重新加载模型

时间:2018-04-21 21:01:57

标签: qt model qml

我有一个我在Combobox中使用的模型。该模型在开始时装载良好。但我想重装它。我尝试使用Q_INVOKABLE,但它不起作用 我的模型在标题中定义:

class StrategiesModel : public QAbstractListModel
{
Q_OBJECT

public:
   enum StrategiesRoles{
      textRole =Qt::UserRole + 1
   };
   explicit StrategiesModel(QObject *parent = nullptr);

   // Basic functionality:
   int rowCount(const QModelIndex &parent = QModelIndex()) const override;

   QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

   QHash<int, QByteArray> roleNames() const override;

   Q_INVOKABLE bool loadStrategie();

private:
   QStringList mStrategies;
   const QString mFileName = "listStrategies.txt";
};

并在来源:

    #include "strategiesmodel.h"

StrategiesModel::StrategiesModel(QObject *parent)
    : QAbstractListModel(parent)
{
    loadStrategie();
}

int StrategiesModel::rowCount(const QModelIndex &parent) const
{
    // For list models only the root node (an invalid parent) should return the list's size. For all
    // other (valid) parents, rowCount() should return 0 so that it does not become a tree model.
    if (parent.isValid())
        return 0;

    // FIXME: Implement me!
    return mStrategies.size();
}

QVariant StrategiesModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    // FIXME: Implement me!
    if(role == textRole)
        return QVariant(mStrategies[index.row()]);
    else
        return QVariant();
}

QHash<int, QByteArray> StrategiesModel::roleNames() const
{
    QHash<int, QByteArray> roles;
        roles[textRole] = "text";
        return roles;
}

bool StrategiesModel::loadStrategie()
{
    mStrategies.clear();
    // Loading list from a file
}

在主要方面,模型加载如下:

qmlRegisterType<StrategiesModel>("Strategies", 1, 0, "StrategiesModel");

但是当我尝试重新加载模型时,它失败了:

strategies.model: StrategiesModel {} // First load works
strategies.textRole: "text"


refresh.onClicked: function(){
    StrategiesModel.loadStrategie(); // Fail
}

我收到了这个错误:

TypeError: Property 'loadStrategie' of object [object Object] is not a function

如何使我的功能可以访问?

谢谢你的支持!

1 个答案:

答案 0 :(得分:1)

当您使用未访问对象的类的名称而不能使用任何方法时,您可以通过其id使用现有对象:

strategies.model: StrategiesModel{ id: some_model} // First load works
strategies.textRole: "text"

refresh.onClicked: function(){
    some_model.loadStrategie();
}

根据我检查的内容loadStrategie将新数据加载到模型中,以便通知视图,您必须在更改前使用beginResetModel(),并在进行更改后使用endResetModel()。< / p>

<强> *。CPP

bool StrategiesModel::loadStrategie()
{
    beginResetModel();
    mStrategies.clear();
    ...
    // Loading list from a file
    ...
    endResetModel();
}