Qt Qml:如何为所有GridView项设置属性

Qt Qml:如何为所有GridView项设置属性,qt,gridview,qml,Qt,Gridview,Qml,我正在尝试更改GridView的所有项目 我曾尝试遍历模型或网格,我在web上查看了类似的示例,但我尝试的所有内容都以无法读取未定义的属性“buttonext”结尾 在我看来,问题在于解释器无法确定网格或模型中的项是按钮。但我不知道怎么投 如果我将日志更改为仅显示该项,而不显示任何属性(请参见代码段),它似乎知道它是一个项。。。见下面我的实验 我唯一能做的就是从委托中设置属性(或调用信号或函数)。但这只影响一个网格项,而不是所有网格项 如何在网格的每个项目上设置属性?或者,如何对每个项目发送信号

我正在尝试更改
GridView
的所有项目
我曾尝试遍历模型或网格,我在web上查看了类似的示例,但我尝试的所有内容都以
无法读取未定义的属性“buttonext”结尾

在我看来,问题在于解释器无法确定网格或模型中的项是
按钮。但我不知道怎么投

如果我将日志更改为仅显示该项,而不显示任何属性(请参见代码段),它似乎知道它是一个项。。。见下面我的实验

我唯一能做的就是从委托中设置属性(或调用信号或函数)。但这只影响一个网格项,而不是所有网格项

如何在网格的每个项目上设置属性?或者,如何对每个项目发送信号或调用函数

我的实验在
函数更改EverythingFunction()

文件:Button.qml

文件:Model.qml

项目
{
id:modelItem
列表模型
{
id:listModel
}
属性int buttonCount:listModel.count
函数更改EverythingFunction()
{
//对于(变量i=0;i
您的方法与此相反:您的方法是获取视图项并对其进行修改,但Qt指出的方法是视图反映模型的信息,并在必要时对其进行修改

下面是一个简单的例子,每次你按下带有“change me”(更改我)文本的按钮时,会增加显示的数字,但如果你按下带有“change all”(更改所有)文本的按钮,则会更改所有数字。据观察,所有操作都是通过模型完成的,而不是通过仅用于显示信息或接收用户交互的视图

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14

Window {
    visible: true
    width: 640
    height: 480
    ListModel{
        id: listmodel
    }
    function changeAll(){
        for(var i=0; i< listmodel.count; ++i){
            listmodel.setProperty(i, "number", listmodel.get(i).number + 1)
        }
    }
    GridView{
        id: grid
        anchors.fill: parent
        clip: true
        model: listmodel
        cellHeight: 120
        cellWidth: 120
        delegate: Item {
            width: grid.cellWidth; height: grid.cellHeight
            Column {
                anchors.fill: parent
                Text { text: model.number; anchors.horizontalCenter: parent.horizontalCenter }
                Button{text: "change me"; onClicked: model.number +=1}
                Button{text: "change all"; onClicked: changeAll()}
            }
        }
    }
    Component.onCompleted: {
        for(var i=0; i < 10; ++i){
            listmodel.append({"number": 0});
        }
    }
}
导入QtQuick 2.14
导入QtQuick.Window 2.14
导入QtQuick.Controls 2.14
导入QtQuick.Layouts 1.14
窗口{
可见:正确
宽度:640
身高:480
列表模型{
id:listmodel
}
函数changeAll(){
对于(变量i=0;i
您的问题不清楚,您在很大程度上抱怨“您可能的解决方案”显然不正确,您的具体目标是什么?您指出如何在每个按钮上设置属性?这是抽象的,所以我的问题是:你想具体修改什么属性?我想在网格的每个项目上设置一个属性。我叫他们
按钮
。我没有“可能的解决方案”-我在
for
循环中进行实验,在网格或模型上进行迭代-每次尝试时,当我在项目后放置属性名称时,我都会得到
未定义的
@EyllanesCtruments是“可能的解决方案”。我的批评是,在你的文章中,你把注意力集中在你的尝试上,而没有首先指出你的具体目标是什么,例如,更清楚的是:我想修改元素Y的属性X,如以下代码所示,使我尝试了P,但是我遇到了这些问题。好吧,我已经发布了一个说明性的例子。@eyllanesc谢谢你,在我的辩护中,我想做的是修改所有项目的任何属性,以便在项目中我可以使用函数
onPropertyChanged
——因为这是我发现的向所有项目发送信号的唯一方法。
Item
{
    id: modelItem

    ListModel
    {
        id: listModel
    }

    property int buttonCount: listModel.count

    function changeEverythingFunction()
    {
    //    for (var i = 0; i < buttonCount; i++)
    //        listModel.setProperty(i, buttonText, "abc")

        for(var childIndex in gridItems.contentItem.children) 
        {
            console.log(listModel.get(childIndex).buttonText)   // Cannot read property 'buttonText' of undefined
            console.log(gridItems.contentItem.children[childIndex].buttonText) // Cannot read property 'buttonText' of undefined
            console.log(gridItems.contentItem.children[childIndex]["buttonText"])   // undefined (I saw this in a SO example)

            var item = gridItems.contentItem.children[childIndex]
            console.log(item)   // qml: QQuickItem(0xe496370)
        }
    }

    MouseArea
    {
        ....
        Rectangle
        {
            ...

            GridView
            {
                id: gridItems

                anchors.fill: parent
                clip: true
                model: listModel

                delegate: Item
                {
                    id: buttonDelegate

                    Button
                    {
                        buttonIndex: gridId
                        buttonText: itemText

                        onChangeEverything:
                        {
                            changeEverythingFunction();
                        }
                    }
                }
            }
        }
    }
}
import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14

Window {
    visible: true
    width: 640
    height: 480
    ListModel{
        id: listmodel
    }
    function changeAll(){
        for(var i=0; i< listmodel.count; ++i){
            listmodel.setProperty(i, "number", listmodel.get(i).number + 1)
        }
    }
    GridView{
        id: grid
        anchors.fill: parent
        clip: true
        model: listmodel
        cellHeight: 120
        cellWidth: 120
        delegate: Item {
            width: grid.cellWidth; height: grid.cellHeight
            Column {
                anchors.fill: parent
                Text { text: model.number; anchors.horizontalCenter: parent.horizontalCenter }
                Button{text: "change me"; onClicked: model.number +=1}
                Button{text: "change all"; onClicked: changeAll()}
            }
        }
    }
    Component.onCompleted: {
        for(var i=0; i < 10; ++i){
            listmodel.append({"number": 0});
        }
    }
}