QML,如何动态地从C++中改变Repeater的Item

Mag*_*yev 1 c++ qt repeater qml

我在网格上有QML Repeater,当我点击项目i发出由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)

            }
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

更新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));
}
Run Code Online (Sandbox Code Playgroud)

dte*_*ech 8

与接受的答案相反,确实有可能不会一直实现整体QAbstractListModel.

这是事实,QStringList没有任何方法来通知更改,但所有你需要做的就是在属性包起来,这样的事情:

Q_PROPERTY(QVariant myModel READ myModel NOTIFY myModelChanged)
...
QVariant myModel() { return QVariant::fromValue(myStringList); }
...
void myModelChanged(); // signal
Run Code Online (Sandbox Code Playgroud)

而就发出myModelChanged要反映模型的变化,每次,是与不同的模式替换它或改变它的内部.并使用该myModel属性Repeater的模型.

但是,如果模型中有很多项目或者委托很复杂,那么实现自己的项目总是一个好主意QAbstractListModel,因为通过上面的方法,转发器将在每次"更改"时重新创建整个模型,而在QAbstractListModel将只更新的实际变化.