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});
}
}
}