QML,如何从C++动态更改Repeater的Item

问题描述 投票:0回答:2

我在网格上有 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));
}
c++ qt qml repeater
2个回答
12
投票

与已接受的答案相反,确实可以不一路实施整个

QAbstractListModel

确实,

QStringList
没有任何方式通知更改,但您所要做的就是将其包装在属性中,如下所示:

Q_PROPERTY(QVariant myModel READ myModel NOTIFY myModelChanged)
...
QVariant myModel() { return QVariant::fromValue(myStringList); }
...
void myModelChanged(); // signal

每次你想反映模型的变化时,只需发出

myModelChanged
,无论是用不同的模型替换它还是在内部更改它。并将
myModel
属性用于
Repeater
的模型。

但是,如果模型中有很多项或者委托很复杂,那么实现自己的

QAbstractListModel
始终是一个好主意,因为通过上述方法,中继器每次都会重新创建整个模型“更改”,而
QAbstractListModel
只会更新实际更改。


4
投票

恐怕这是不可能的。

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_

您可以在这里获取所有代码。

© www.soinside.com 2019 - 2024. All rights reserved.