QML,如何从C++; P>在网格上有QML中继器,当我点击条目i时,发出由C++类处理的信号,然后在C++中改变数组,然后分配为QML中继器的模型。有没有办法改变C++模型的两个元素,而不是像我一样改变整个模型?

QML,如何从C++; P>在网格上有QML中继器,当我点击条目i时,发出由C++类处理的信号,然后在C++中改变数组,然后分配为QML中继器的模型。有没有办法改变C++模型的两个元素,而不是像我一样改变整个模型?,c++,qt,qml,repeater,C++,Qt,Qml,Repeater,那是我的qml文件 Grid{ height:width rows:8 columns: 8 Repeater{ id: chessPiecesRptr ... signal chessfigureSelected(int index) delegate: Item{ id:chessPiecesItm Image{ ... } MouseArea

那是我的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));
}
void ChessFiguresClass::changeModel()
{
QStringList数据表;

对于(int i=0;i我担心这是不可能的。QList(和QStringList)没有通知Qml项其更改的内部机制。只有当Qml项的model属性更改时,才会重新读取整个列表。 我以前也遇到过同样的问题,我使用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_
Q_PROPERTY(QVariant myModel READ myModel NOTIFY myModelChanged)
...
QVariant myModel() { return QVariant::fromValue(myStringList); }
...
void myModelChanged(); // signal
\ifndef\u SIMPLEMODEL\u H_
#定义简单模型_
#包括
类SimpleStringModel:PublicQAbstractListModel
{
Q_属性(整数计数读取计数通知计数已更改)
Q_禁用_复制(SimpleStringModel)
Q_对象
公众:
显式SimpleStringModel(QObject*parent=0);
SimpleStringModel(常量QList和初始列表,QObject*parent=0);
虚拟~SimpleStringModel();
私人:
枚举角色{
ModelDataRole=Qt::UserRole+1
};
公众:
int count()常量;
公众:
无效附加(常量字符串和项目);
无效插入(整数索引、常量字符串和项目);
无效附加(常量QList和项目);
无效插入(整数索引、常量QList和项目);
bool-removeOne(const-QString和item);
内部移除所有(const QString&item);
无效删除(int索引);
QList()常量;
信号:
void countChanged();
//QabstracteModel接口
公众:
虚拟整数行数(常量QModelIndex&parent)常量;
虚拟QVariant数据(常量QModelIndex&index,int角色)常量;
虚拟QHash roleNames()常量;
私人:
QList m_数据;
};
#endif/\u SIMPLEMODEL\u H_

您可以获得所有的代码。我希望这对您有所帮助。

与公认的答案相反,不必千方百计实现一个完整的
QAbstractListModel

确实,
QStringList
没有任何通知更改的方法,但您所要做的就是将其包装到属性中,类似于这样:

#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_
Q_PROPERTY(QVariant myModel READ myModel NOTIFY myModelChanged)
...
QVariant myModel() { return QVariant::fromValue(myStringList); }
...
void myModelChanged(); // signal
每次您想反映模型中的更改时,只需发出
myModelChanged
,即用不同的模型替换它或在内部更改它。并对
Repeater
的模型使用
myModel
属性

但是,如果模型中有很多项或者代理很复杂,那么最好实现自己的
QAbstractListModel
,因为使用上述方法,中继器每次“更改”时都会重新创建整个模型,而
QAbstractListModel
只会更新实际更改