我在网格上有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中继器模型的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));
}

最佳答案

恐怕是不可能的。 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_

您可以获取所有代码here。希望对您有帮助。

关于c++ - QML,如何从C++动态更改Repeater的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24840036/

10-13 09:46