我在网格上有 QML Repeater,当我单击项目时,我发出由 C++ 类处理的信号,然后更改 C++ 中的数组,然后将其指定为 QML Repeater 的模型。有没有办法只更改 C++ 模型的两个元素,而不是像我那样更改整个模型?
这是我的 qml 文件
Grid{
height:width
rows:8
columns: 8
Repeater{
id: chessPiecesRptr
...
signal chessfigureSelected(int index)
delegate: Item{
id:chessPiecesItm
Image{
...
}
MouseArea
{
anchors.fill:parent
onClicked: {
chessPiecesRptr.chessfigureSelected(index)
}
}
}
}
更新QML Repeater模型的C++方法
void ChessFiguresClass::changeModel()
{
QStringList dataList;
for(int i=0;i<64;i++)
dataList.append(QChar(posArray[i]));
QQmlProperty::write(chessPiecesRptr, "model", QVariant::fromValue(dataList));
}
与已接受的答案相反,确实可以不一路实施整个
QAbstractListModel
。
确实,
QStringList
没有任何方式通知更改,但您所要做的就是将其包装在属性中,如下所示:
Q_PROPERTY(QVariant myModel READ myModel NOTIFY myModelChanged)
...
QVariant myModel() { return QVariant::fromValue(myStringList); }
...
void myModelChanged(); // signal
每次你想反映模型的变化时,只需发出
myModelChanged
,无论是用不同的模型替换它还是在内部更改它。并将 myModel
属性用于 Repeater
的模型。
但是,如果模型中有很多项或者委托很复杂,那么实现自己的
QAbstractListModel
始终是一个好主意,因为通过上述方法,中继器每次都会重新创建整个模型“更改”,而 QAbstractListModel
只会更新实际更改。
恐怕这是不可能的。
QList<T>
(和 QStringList)没有内部机制来通知 Qml 项其更改。仅当 QML 项的模型属性发生更改时,才会再次读取整个列表。
我之前也遇到过同样的问题,我使用 QAbstractListModel 作为基类实现了一个字符串列表。标题看起来像这样:
#ifndef _SIMPLEMODEL_H_
#define _SIMPLEMODEL_H_
#include <QtCore>
class SimpleStringModel : public QAbstractListModel
{
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_DISABLE_COPY(SimpleStringModel)
Q_OBJECT
public:
explicit SimpleStringModel(QObject* parent = 0);
SimpleStringModel(const QList<QString>& initList, QObject* parent = 0);
virtual ~SimpleStringModel();
private:
enum Roles{
ModelDataRole = Qt::UserRole+1
};
public:
int count() const;
public:
void append(const QString& item);
void insert(int index, const QString& item);
void append(const QList<QString>& items);
void insert(int index, const QList<QString>& items);
bool removeOne(const QString& item);
int removeAll(const QString& item);
void removeAt(int index);
QList<QString> list() const;
signals:
void countChanged();
// QAbstractItemModel interface
public:
virtual int rowCount(const QModelIndex &parent) const;
virtual QVariant data(const QModelIndex &index, int role) const;
virtual QHash<int, QByteArray> roleNames() const;
private:
QList<QString> m_data;
};
#endif //_SIMPLEMODEL_H_
您可以在这里获取所有代码。