如何从 C++ 动态更改中继器的项目

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

我在网格上有一个 QML 中继器,当我单击一个项目时,我会发出一个由 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)
                }
            }
        }
    }
}

更新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个回答
13
投票

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

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.