QML,如何从c++中动态更改中继器的项

QML,How to dynamicaly change Item of Repeater from C++

本文关键字:中继器 动态 c++ QML      更新时间:2023-10-16

我在网格上有QML中继器,当我点击项目时,我发出由c++类处理的信号,然后在c++中更改数组,然后将其指定为QML中继器的模型。是否有一种方法可以改变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中继器模型的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(和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_

你可以在这里得到所有的代码。我希望这对你有帮助。