2014-11-03 98 views
0

里面一个QML的ListView,我想调用一个函数在单击鼠标区域时:QML:定义ListElement函数调用中的ListView

ListView{ 
    anchors.fill: parent 
    orientation: ListView.Horizontal 

    model: myModel 

    delegate: 
    Rectangle { 
     anchors.fill: parent 
     Text { 
      anchors.centerin: parent 
      text: label 
     } 
     MouseArea { 
      width: 30 
      height: parent.height 
      onClicked: { 
       doSomething() 
      } 
     } 
    } 
} 

我的应该是一个溢出菜单。在ListModel(myModel)中,我希望能够说出doSomething()被调用时会发生什么。我怎么做?也许是这样?

ListModel { 
    id: myModel 

    ListElement { 
     label: "New" 
     doSomething: { 
      canvas.clear() 
     } 
    } 
} 

我不知道。我搜索了网页,但我找不到任何东西。
我为此使用ListView/Model,因为我想动态添加和删除菜单条目。
感谢您的关注! =)

+0

你的目标是,到底是什么?触发对模型w.r.t的修改。 'doSomething()'的结果或从'doSomething()'修改模型的结果? – BaCaRoZzo 2014-11-03 22:26:19

+0

我根本不想修改模型。它应该是一个溢出菜单。每个条目都应该在点击时做些事情。让我编辑主要帖子。 – 2014-11-04 07:29:16

回答

4

QRC:///main.qml:49 ListElement:不能使用脚本属性值

这就是你和你的代码得到。所以你不能将模型元素的任何属性设置为脚本。

我遇到这种情况通过将功能模型,而不是模型元素:

ListView{ 
    anchors.fill: parent 
    orientation: ListView.Horizontal 

    model: myModel 

    delegate: 
    Rectangle { 
     anchors.fill: parent 
     color: "red" 
     Text { 
      anchors.centerIn: parent 
      text: label 
     } 
     MouseArea { 
      anchors.centerIn: parent 
      width: 30 
      height: parent.height 
      onClicked: { 
       myModel.actions[label](); 
      } 
     } 
    } 
} 

ListModel { 
    id: myModel 

    property var actions : { 
     "New": function(){ console.log("clicked!"); } 
    } 

    ListElement { 
     label: "New" 
    } 
} 

虽然基于文本索引行为是一种MEH的,你应该让它所以在每一个元素模型具有独特的属性(如索引),并将它们用作actions词典的键。

(在一个侧面说明,你忘了鼠标区域的centerIn,我不知道为什么你使用的30宽,而不是仅仅填充母)

+0

不错!我甚至不知道你能做到这一点,非常感谢你!我会按照你的意见和使用指数。为了回答你的小问题,这不是我的实际代码,我只是想出了一些简单的代码;) – 2014-11-04 09:37:51

+0

我在QML中使用的将是枚举或字符串,但'id'字符串(类似于你的名字一个变量),如'key:'new''。如果列表中元素的顺序发生更改,则索引可能会变得烦人。 – coyotte508 2014-11-04 10:15:11

+0

如果您的“菜单项”在使用过程中未被移除/重新排列,您可以使用默认情况下在委托中提供的'index'角色(请参见[here](http://qt-project.org/doc/qt- 5/qtquick-modelviewsdata-modelview.html#视图代表))。所以,不需要添加其他指标。 'index'可以直接用在'Rectangle'的'MouseArea'中。然而,正如@ coyotte508所述,如果结构发生变化,这将很快变得烦人。 – BaCaRoZzo 2014-11-04 10:27:18