2014-11-03 69 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