代码之家  ›  专栏  ›  技术社区  ›  Dark Patate

QML:重新加载模型

  •  1
  • Dark Patate  · 技术社区  · 6 年前

    我在组合框中使用了一个模型。该模型一开始负载良好。但我想重新加载它。我试着用 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 回复  |  直到 6 年前
        1
  •  2
  •   eyllanesc Yonghwan Shin    6 年前

    当您使用类的名称时,您没有访问对象,因此无法使用任何方法,您可以通过其 id :

    strategies.model: StrategiesModel{ id: some_model} // First load works
    strategies.textRole: "text"
    
    refresh.onClicked: function(){
        some_model.loadStrategie();
    }
    

    根据我查的 loadStrategie 将新数据加载到模型中,以便通知视图您必须使用 beginResetModel() 变更前和 endResetModel() 进行更改后。

    *.cpp

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