たとえば、QML にそのようなモデルがあります。
ListModel{
id: mainlist
ListElement
{
name: "Name1"
type: "subMenu"
toogle: false
iconSource: ""
function actionClick()
{
console.log("actionclick is passed for 0 item!")
}
}
ListElement
{
name: "Manage Favorites"
type: "subMenu"
toogle: false
iconSource: "image://provider/common/endless_menu/list_icons/fav"
function actionClick()
{
console.log("actionclick is passed for 1 item!")
}
}
ListElement
{
name: "Name2"
type: "subMenu"
toogle: false
iconSource: "image://provider/common/endless_menu/list_icons/active"
function actionClick()
{
console.log("actionclick is passed for 2 item!")
}
}
ListElement
{
name: "Name3"
type: "subMenu"
toogle: false
iconSource: "image://provider/common/endless_menu/list_icons/scan"
function actionClick()
{
console.log("actionclick is passed for 3 item!")
}
}
ListElement
{
name: "Manual Frequency Input"
type: "commonBtn"
toogle: false
iconSource: ""
function actionClick()
{
console.log("actionclick is passed for 4 item!")
}
}
function onStart(currIndex)
{
console.log("test is passed for " + currIndex + "item!")
}
}
そのため、ListView 要素とid: optionlist
、コントロール リスト要素用の ListDelegate があります。私はいくつかのモデルを持っています - プロジェクトのメニューオプション用に作成されたすべての要素。したがって、onModelChanged: optionlist.model.onStart()
リストファイルのコードは完全に機能します。
問題は、MouseArea 要素のactionClick()
listDelegate スクリプトから関数を呼び出すことです。OnClicked
これを行うことは可能ですか?このようなもの:optionlist.model.ContentItem.children[currentIndex].actionClick()
たぶん、または他の何か?
更新: 申し訳ありませんが、Amit Tomer、タスクを正しく説明していない可能性があります...そのため、次のフィールドを持つモデルの要素が必要です:
name: - text for element
type: - type of element (button, radio button, check button or submenu) - needed for corect action when user clicked on this item
toogle: - boolean value for radio/check buttons state, and for some internal operations.
iconSource: - path for icon, if it needed.
function actionClick() - function, which will be execute when user clicked on this item.
これはすべて、すべてのオプション メニュー ツリーを明確かつ簡単に埋めるために行う必要があります。このメニューツリーは別ファイルに書きます。
以下のコードでは、作業モデルを示しています。
Item{
id: menuoptions
property ListModel prev: manageFavorites
property bool root: true
//Main Menu
property alias mainlist: mainlist
ListModel{
id: mainlist
ListElement
{
name: "Band: "
type: "subMenu"
toggle: false
iconSource: ""
}
ListElement
{
name: "Manage Favorites"
type: "subMenu"
toggle: false
iconSource: "image://provider/common/endless_menu/list_icons/fav"
}
ListElement
{
name: "Show: "
type: "subMenu"
toggle: false
iconSource: "image://provider/common/endless_menu/list_icons/active"
}
ListElement
{
name: "Scan"
type: "subMenu"
toggle: false
iconSource: "image://provider/common/endless_menu/list_icons/scan"
}
ListElement
{
name: "Manual Frequency Input"
type: "commonBtn"
toggle: false
iconSource: ""
}
function actionClick(currIndex)
{
switch(currIndex)
{
case 0:
{
prev = mainlist
menuList.model = bandlist
break
}
case 1:
{
prev = mainlist
menuList.model = manageFavorites
break
}
case 2:
{
prev = mainlist
menuList.model = showlist
break
}
case 3:
{
console.log("Scan started")
mainlist.setProperty(3, "name", getScan())
break
}
case 4:
{
console.log("Speller for Manual Frequency Input open!")
break
}
}
}
function onStart()
{
console.log("root model loaded")
root = true
mainlist.setProperty(0, "name", "Band: " + getBand())
mainlist.setProperty(2, "name", "Show: " + getShow())
mainlist.setProperty(3, "name", getScan())
}
}
//First Lvl subMenu
property alias bandlist: bandlist
ListModel{
id: bandlist
... Analog menulist
}
property alias manageFavorites: manageFavorites
ListModel{
id: manageFavorites
... Analog menulist
}
property alias showlist: showlist
ListModel{
id: showlist
... Analog menulist
}
}
ご覧のとおり、私はあなたが言うようなことを書きました。もっと良い解決策が見つからなければ大丈夫です。より良い解決策 - actionClick() 一般関数を削除し、その一部 (ケース ブロックのコード) をそれぞれ ListElement に追加しました。そして、要素のクリック時に呼び出します。
ListElement からこの関数を呼び出す方法がわかりません。WPF では、ListElement を喜ばせるカスタム コンポーネントを作成するだけです。しかし、QMLでこれを行う方法がわかりません。
不明な点はお尋ねください。
更新: 問題は解決しました。答えの私の変種。ありがとうございます。