2013-07-09 46 views
0

我如何访问Text.text项目的ListView代表内从事件处理程序的ListView访问委托项目,示例代码(可能有语法错误)以下。QML爪哇 - 从事件处理程序

ListView { 
    id: mainLView 
    model: ListViewModel {} 
    delegate: Rectangle { 
     id: theRect 
     Text { 
     id: theText 
     text: "" 
     } 
    } 
    onMovementEnded { 
     //here is where I would like to access the text in Text, e.g 
     theText.text = "New Value" 
    } 
} 

由于无法从事件处理程序访问文本,因此我的代码无法使用。我如何完成设置文本值?

编辑:为了完整性: 我可以将项目添加到通过Java代码(表观负载期间)ListView中,通过代码又名

mainLView.model.append({'name': "First Value","city":"London"}); 
var myValue = model.get(currentIndex).city // or name 
访问事件内部在ListView的值(一个或多个)

但我仍然无法找到一种方法来为委托文本{text:“”}赋值。

EDIT 2 7月10日 这里是什么,我想实现一个更完整的代码示例。

ListView { 
    id: mainLView 
    model: ListModel { id: mainModel} 
    delegate: Rectangle { 
     id: theRect 
     Text { 
     id: theText 
     text: nameX 
     } 
    } 
    Component.onCompleted: { 
     for (var x=1; x < 99; x++) { 
      var data = {'nameX': "Name: " + x, "numberX":x}; 
      mainModel.append(data); 
     } 
    } 
    onMovementEnded { 
     //here I want to set the value to numberX e.g (this does not work) 
     theText.text = mainView.model.get(currentIndex).numberX 
    } 
} 
+0

这个问题很难回答,因为它不清楚你真正想从你的例子中得到什么。 ListView呈现每个ListModel元素的委托。你在问如何用值更新每个元素或询问如何更新特定元素?这个问题真的似乎归结为你如何指定你想编辑的元素。一旦您向我们提供了这些信息,它可以帮助您获得索引并进行更新。 – Deadron

+0

Deadron,感谢您的评论。我想在移动结束时更新索引处的值(上面的代码很简短,但表明了问题)。 – Nepaluz

+0

我想在信号内移动结束时更新索引值(并因此更新列表视图)。我的完整代码实际上有两个项目给listmodel中的每个元素;我想在列表视图滚动时显示一个值,而另一个值则停止显示,但为了简明起见,我缩减了上面的代码以显示我需要帮助的位置。让我知道你是否想要一个更完整的代码示例。 – Nepaluz

回答

2

鉴于您的意见,我认为以下可能会做你想做的。

delegate: Rectangle { 
     id: theRect 
     Text { 
     id: theText 
     text: mainLView.moving ? nameX : numberX 
     } 
    } 

这应该显示ListView移动时的一个值,而不是当移动时不同的值。

+0

这是最优雅的!我实际上已经搜索了更早,并得到了类似的建议,但没有在ListView ID移动之前!谢谢 – Nepaluz

+0

不客气! – Deadron

0

将字符串值分配给列表视图委托中的文本(文本元素)。你可以使用模型的属性名称。

如下。这里的名字来自Jason对象{'name':'First Value','city':'London'});

delegate: Rectangle { 
     id: theRect 
     Text { 
     id: theText 
     text: name // or city 
     } 
    } 

看看这个链接(http://kunalmaemo.blogspot.kr/2011/03/creating-custom-listview-delegate-in.html)它会有所帮助。

BTW,以得到代表文本,你需要从模型得到它,你不能从委托得到它,不如授人可重复使用元素列表视图,其价值不断变化。

+0

Kunal,你错过了这个问题。在我上面的编辑中,我提到我已经使用java设置了文本,我想从事件处理函数中设置(更适当地更改)“text:name”的值,即onMovementEnded – Nepaluz

+0

ok,那么您需要获取索引元素和更新项目在模型 – Kunal

+0

Kunal,那是问题。你如何获得上面代码中的文本索引? – Nepaluz

2

的ListView具有您可以使用当前索引访问项目的属性CURRENTITEM。要从委托中访问某些内容,您的委托需要在其顶级项目中拥有一个属性,因为只有这些属性暴露给外部。这样的东西应该工作:

ListView { 
    id: mainLView 
    model: ListModel { id: mainModel} 
    delegate: Rectangle { 
     property alias text: theText.text 
     Text { 
     id: theText 
     text: nameX 
     } 
    } 

    onMovementEnded { 
     mainLView.currentItem.text = "foo"; 
    } 
} 
+0

tmcguire,感谢您的贡献。同样,我发现了一些类似的用于添加属性别名的方法,虽然这也起作用,但响应似乎不同步!正确回答这个问题。 – Nepaluz