1 / 1 / 0
Регистрация: 29.05.2011
Сообщений: 33
1

Доступ к функциям QML

16.01.2013, 18:11. Показов 1819. Ответов 6
Метки нет (Все метки)

У меня есть описанная модель:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
ListModel{
        id: mainlist
        ListElement
        {
            name: "Name1"
            type: "subMenu"
            toogle: false
 
            function actionClick()
            {
                console.log("actionclick is passed for 0 item!")
            }
            iconSource: ""
        }
        ListElement
        {
            name: "Manage Favorites"
            type: "subMenu"
            toogle: false
 
            function actionClick()
            {
                console.log("actionclick is passed for 1 item!")
            }
            iconSource: "image://provider/common/endless_menu/list_icons/fav"
        }
        ListElement
        {
            name: "Name2"
            type: "subMenu"
            toogle: false
 
            function actionClick()
            {
                console.log("actionclick is passed for 2 item!")
            }
            iconSource: "image://provider/common/endless_menu/list_icons/active"
        }
        ListElement
        {
            name: "Name3"
            type: "subMenu"
            toogle: false
 
            function actionClick()
            {
                console.log("actionclick is passed for 3 item!")
            }
            iconSource: "image://provider/common/endless_menu/list_icons/scan"
        }
        ListElement
        {
            name: "Manual Frequency Input"
            type: "commonBtn"
            toogle: false
 
            function actionClick()
            {
                console.log("actionclick is passed for 4 item!")
            }
            iconSource: ""
        }
 
        function test(currIndex)
        {
            console.log("test is passed for " + currIndex + "item!")
        }
    }
вопрос вот в чем. Из делегата листа, на событии OnClick без проблем вызывается функция тест следующим кодом:
C++ (Qt)
1
2
//optionlist - имя ListView
optionlist.model.test(currentIndex)
может кто-то подсказать каким образом можна вызвать функцию actionClick() из элементов из того же места? И возможно ли вобще такое дело... Ну или как можно спокойно вызвать соответствующую функцию из той же самой функции test в модели? что-то типа mainlist[currIndex].actionClick()?

Добавлено через 35 минут
очень нужно разъяснение по данному вопросу. Может кто-то помочь?

Добавлено через 22 часа 51 минуту
Ну же, ребята, что ни одной стоящей идеи?

Добавлено через 4 часа 5 минут
Может кто-то не понял что мне нужно? Если есть такие - маякните, дам более подробное описание.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2013, 18:11
Ответы с готовыми решениями:

Доступ к функциям C++ из QML файла
Добрый день! Иниациализация QML объекьта m_authQML = new QQuickView(); ...

Доступ к дочерним объектам в TabView в Qml Qt
Добрый день! Помогите пожалуйста решить проблему. Не могу получить доступ к модели, которая...

Как получить доступ к qml элементам из с++
здравствуйте. пытаюсь управлять формой из срр, но получаю сегфолт. в qml при нажатии на кнопку...

Подсветка QML элементов QML-ного плагина в QtCreator в случае нахождения QML файлов плагина в ресурсах!
Здравствуйте! Если сделать плагин для QML и подключить его в основном проекте ну как - то так:...

6
1441 / 1322 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
17.01.2013, 08:56 2
Если model.get(index).actionClick() не сработает, то наверное никак.
0
1 / 1 / 0
Регистрация: 29.05.2011
Сообщений: 33
17.01.2013, 13:27  [ТС] 3
Ну это аналогия... model.get(index) - может вернуть только поле... А функция в ListElement не является полем... потому и проблемма. и сигнал туда закинуть не могу... вернее сигнал могу, а реализацию нет - скрипты не допускаются в ListElement.

Например в WPF уже давно бы решил проблему простым созданием компоненты аналогичной ListElement с функцией. Если есть возможность сделать такое в Qt 5, отправте по ссылке с примером...

Сейчас все это дело имеет следующий, рабочий вид (файлик с моделями):
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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
    }
}
onStart() - вызывается при загрузке модели, а actionClick(currIndex) - при клике. Как видите свич - очень криво, ну и при редактировании менюшек нужно не забыть правильно все поменять... + там много каких еще подводных камней... потому было бы просто идеально найти способ actionClick() перенести соответственно поблочно в айтем - кейсы закинуть в айтем... Но тут проблемма...

З.Ы. сейчас могу тупить страшно - после WPF кьют/кьюмл кажется детским и тупым...
0
1441 / 1322 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
17.01.2013, 15:49 4
Если через проперти можно передавать имя конкретной модели, то наверное можно записать это в ListElement
Javascript
1
2
3
4
5
6
7
8
        ListElement
        {
            name: "Scan"
            type: "subMenu"
            toggle: false
            specificModel: showlist
            iconSource: "image://provider/common/endless_menu/list_icons/scan"
        }
0
1 / 1 / 0
Регистрация: 29.05.2011
Сообщений: 33
17.01.2013, 16:02  [ТС] 5
Емм.... Поле ListElement не может получить обьект или скрипт.
C
1
The names used for roles must begin with a lower-case letter and should be common to all elements in a given model. Values must be simple constants; either strings (quoted and optionally within a call to QT_TR_NOOP), boolean values (true, false), numbers, or enumeration values (such as AlignText.AlignHCenter).
Пруф: http://doc.qt.digia.com/qt/qml-listelement.html - цытата оттуда.

Темболее такой вариант не подходит - елементы могут себя вести как субменю (как Вы предложили) или как клавиша (Button/RadioBtn/CheckBtn). Если бы были только субменю и можно было бы обэкт передать как поле - тогда просто отлично. Но не та задача.

Впринцыпе я сейчас переделываю все через Айтемы и когда закончу представлю в студию... Может кому-то будет полезно, ну и для оценки знающими...
0
1441 / 1322 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
17.01.2013, 21:02 6
А что вообще хочешь сделать? Не очень понимаю что за менюшка получается.
0
1 / 1 / 0
Регистрация: 29.05.2011
Сообщений: 33
18.01.2013, 14:15  [ТС] 7
Меню состоит с елементов, которые могут вести себя как вход в подменю, клавиша, радио бокс, чек бокс. У всех них разный функционал - они вызывают разные методы с бекенда, максимум что можно выделить в общую функцию - поддержка радио батонов в группе (что бы выделен был только 1) и переход в подменюшки. и то не всегда. + хочу сделать что бы все дерево менюшек можно было записать в 1 файле - просто група компонентов которые отвечают за 1 скрин. ну а потом в компоненте листа просто изменяется модель что бы весь екран не перерисовывать.
Так как код возможно будут потом 300 раз править, менюшки, связи, ну или просто кто-то другой будет ним заниматься нужно сделать так, что бы дерево менюшек можно было легко править. Как вариант - одно меню - одна модель где у кажного елемента свой метод OnClick() который будет вызываться в делегате листа. Общий вид - для пощупать - это какраз код в 1 посте, ну с добавлением для кажной модели проперти с ссылкой на предыдущее меню.
+ еще момент есть. Некоторые елементы должны изменять свой текст в зависимости от данных с бекенда. Типа клавиша для выбора диапазонов радио (АМ, ФМ и тд) будет называться ("Band: " + gateway.getCurrBand()) - так что что-то конкретное сделать не получится.

Воот... Самый простой вариант - в ListElement добавить функцию и ее вызвать. Но это я так понял не выполнимо...

Добавлено через 15 минут
Вот, как и обещал, закидываю робочий вариант который как раз то что и задумывалось, но с другой реализацией.

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
import QtQuick 2.0
 
/*
Elements of model:
name - displayed text
type - type of element, for clicked event
toggle - state for radio and check btn
iconSource - path to icon
 
*/
/*
TYPE:
radioBtn
checkBtn
commonBtn
subMenu
*/
Item{
    id: menuoptions
 
    //property ListModel prev: listmodel
 
    property Item curr: mainList
 
    //TEST FUNCTIONS
    property string band: "AM"
    property string show: "All"
    //END TEST FUNCTION
 
//Main Menu Radio
    Item{
        id: mainList
        property int count: 7
        property Item prev
 
        children:
        [
            Item
            {
                property string name: "Band: "
                property string type: "subMenu"
                property bool toggle: false
                property string iconSource: ""
 
                property bool need: true
 
                function onClick()
                {
                    curr = bandList
                    loadModel()
                }
            },
            Item
            {
                property string name: "Manage Favorites"
                property string type: "subMenu"
                property bool toggle: false
                property string iconSource: "image://provider/common/endless_menu/list_icons/fav"
 
                property bool need: true
 
                function onClick()
                {
                    curr = manageFavList
                    loadModel()
                }
            },
            Item
            {
                property string name: "Show: "
                property string type: "subMenu"
                property bool toggle: false
                property string iconSource: "image://provider/common/endless_menu/list_icons/active"
 
                property bool need: true
 
                function onClick()
                {
                    curr = showList
                    loadModel()
                }
            },
            Item
            {
                property string name: "Scan"
                property string type: "subMenu"
                property bool toggle: false
                property string iconSource: "image://provider/common/endless_menu/list_icons/scan"
 
                property bool need: true
 
                function onClick()
                {
                    if (!listmodel.get(menuList.currentIndex).toggle)
                    {
                        listmodel.setProperty(menuList.currentIndex, "toggle", true)
                        listmodel.setProperty(menuList.currentIndex, "name", "Scan")
                    }
                    else
                    {
                        listmodel.setProperty(menuList.currentIndex, "toggle", false)
                        listmodel.setProperty(menuList.currentIndex, "name", "Stop")
                    }
 
                }
            },
//optional
            Item
            {
                property string name: "Alternative Frequency"
                property string type: "checkBtn"
                property bool toggle: false
                property string iconSource: ""
 
                property bool need: false
 
                function onClick()
                {
                    if (listmodel.get(menuList.currentIndex).toggle)
                    {
                        listmodel.setProperty(menuList.currentIndex, "toggle", false)
                        listmodel.setProperty(menuList.currentIndex + 1, "toggle", false)
                    }
                    else
                    {
                        listmodel.setProperty(menuList.currentIndex, "toggle", true)
                    }
                }
            },
            Item
            {
                property string name: "Regionalization"
                property string type: "checkBtn"
                property bool toggle: false
                property string iconSource: "image://provider/common/endless_menu/list_icons/scan"
 
                property bool need: false
 
                function onClick()
                {
                    if (listmodel.get(menuList.currentIndex - 1).toggle)
                    {
                        if (listmodel.get(menuList.currentIndex).toggle)
                        {
                            listmodel.setProperty(menuList.currentIndex, "toggle", false)
                        }
                        else
                        {
                            listmodel.setProperty(menuList.currentIndex, "toggle", true)
                        }
                    }
 
                }
            },
//end optional
            Item
            {
                property string name: "Manual Frequency Input"
                property string type: "commonBtn"
                property bool toggle: false
                property string iconSource: ""
 
                property bool need: true
 
                function onClick()
                {
                    console.log("Speller for Manual Frequency Input open!")
                }
            }
        ]
        function preLoad()
        {
            console.log("preload Func")
            children[0].name = "Band: " + band
            children[2].name = "Show: " + show
            if (band == "SAT" || band == "AM")
            {
                children[4].need = false
                children[5].need = false
            }
            if (band == "FM")
            {
                children[4].need = true
                children[5].need = true
            }
        }
    }
 
//First Lvl subMenu Radio
    Item{
        id: bandList
        property int count: 3
        property Item prev: mainList
 
    //Analog as mainList
    }
 
    Item{
        id: manageFavList
        property int count: 3
        property Item prev: mainList
 
    //Analog as mainList
        function preLoad()
        {
            console.log("preload Func for Manage Favorite List")
            //Insert into model fav stations from 0 item
            //favcount = gateway.getFavCount()
        }
        function favClick()
        {
            console.log("Favorite item clicked")
        }
    }
 
    Item{
        id: showList
        property int count: 2
        property Item prev: mainList
 
    //Analog as mainList
    }
 
 
 
//Service Items
    property alias listmodel: listmodel
    ListModel{
        id: listmodel
}
    function loadModel()
    {
        console.log("loader menu")
        favcount = 0;
        listmodel.clear()
        curr.preLoad()
        for (var i=0;i<curr.count;i++)
        {
            if (curr.children[i].need){
                listmodel.append({"name": curr.children[i].name,
                                  "type":curr.children[i].type,
                                  "toggle":curr.children[i].toggle,
                                  "iconSource":curr.children[i].iconSource})
            }
        }
    }
 
    function actionClick(currIndex)
    {
        if (favcount == 0)
            curr.children[currIndex].onClick()
        else
        {
            if (currIndex <= favcount - 1)
                curr.favClick()
            else
               curr.children[currIndex-favcount].onClick()
        }
    }
 
    function toggled(index)
    {
        for (var i=0; i<listmodel.count; i++)
            listmodel.setProperty(i, "toggle", false)
        listmodel.setProperty(index, "toggle", true)
    }
}
Как видите, все экраны менюшек записаны в виде айтемов, ну и у каждого есть свой обработчик нажатий. ну а при переходе меню просто перезаполняется общая модель. Тут еще править нужно, но то косметика. Еще думаю над тем что бы список айтемов вынести в отдельные файлы - просто меню опций будет в 3 разных местах минимум, и совершенно разные.

Есть вопросы - отвечу.

З.Ы. Естественно намного проще и красивее, как по мне, было бы если место айтемов можно было использовать модели - ну как в начальном посте, но увы...

Добавлено через 1 минуту
UPDATE: Впринципе вопрос решен. Прошу оценить знающих.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2013, 14:15

QMl/QT при нажатии на кнопку должен окрыться другой qml файл
Додал anchors Вот что я сделал: import QtQuick 2.5 import QtQuick.Controls 1.4 ...

Как подключить QML-файл в C++ по моде, а также получить ссылки на QML-элементы в C++
Читал в интернете, как подключать QML-файлы. Кто-то использует QQmlView, кто-то...

qml - что из себя представляет qml
Решил написать игру на Qt,выбор остановился на танчиках.Посмотрел примеры и понял что все игры ,что...

QML вызов другого qml
Всем привет. Название темы немного неверное. Вообщем проблема такая. Делаю игру на qml, и есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.