У меня есть, например, такая модель в моем 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()
в файле списка работает отлично.
Проблема заключается в вызове функции actionClick()
из сценария listDelegate OnClicked
в элементе MouseArea. Можно ли сделать это? Что-то вроде этого: optionlist.model.ContentItem.children[currentIndex].actionClick()
может быть или что-то другое?
ОБНОВЛЕНИЕ: Извините, Амит Томер, возможно, я неправильно объясняю задачу... Итак, мне нужен элемент в модели со следующими полями:
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.
Все это необходимо сделать для наглядного и легко заполняемого дерева меню All option. Это дерево меню будет записано в отдельный файл.
В коде ниже я показываю работающую модель:
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() и добавить ее часть (код в блоках case) в ListElement соответственно. И вызовите его, когда элемент щелкнет.
Я не знаю, как вызвать эту функцию из ListElement. В WPF я бы просто создал пользовательский компонент, который заменил бы ListElement и все! Но я не знаю, как это сделать в QML.
Мне что-то непонятно - спрашивайте.
ОБНОВЛЕНИЕ: Проблема решена. Мой вариант в ответах. Спасибо всем.