我有一个我在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
如何使我的功能可以访问?
谢谢你的支持!
答案 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();
}