Russian Qt Forum
Ноябрь 23, 2024, 00:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить id текущего объекта/кнопки  (Прочитано 9194 раз)
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« : Декабрь 14, 2016, 19:55 »

Имеется кнопка, необходимо получить id текущей нажатой кнопки. Кнопки будут генерироваться динамически и возможности прописать id нет.
Как вариант this.id - но он не работает, может кто знает?  Улыбающийся

Код:
property string pageid
....
            Button {
                id: p1
                text: "Push 1"
                onClicked: {
                    pageid = String(this.id) // не работает!! как получить?
                    console.log(pageid)
                }
            }
« Последнее редактирование: Декабрь 14, 2016, 19:59 от vebmaster » Записан
navrocky
Moderator
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Декабрь 15, 2016, 09:36 »

Сам по себе id существует только на этапе парсинга QML, далее он нигде не хранится, движок оперирует указателями на объекты.
Соответственно для динамически создаваемых объектов id не существует в принципе. Поэтому его получить нельзя.

Объясните задачу, зачем вам понадобилось получать id?

Есть objectName который можно назначать и запрашивать..

Так-же если нужен уникальный идентификатор объекта в виде строки, то можно просто привести this к строке:
Код:
QtObject {
    Component.onCompleted: console.log(this.toString())
}

Вывод:
qml: QObject(0x2390030)
Записан

Гугль в помощь
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #2 : Декабрь 15, 2016, 14:08 »

Спасибо за разъяснения.
Ну если коротко, то:
имеется StackView. На 1 экране будут расположены 52 кнопки. На 2 экране будет вложен через Loader{} файл соответствующий иду нажатой кнопки, 52 кнопки = 52 файла qml.
В ручную создавать не хочу, поэтому хочу получить id нажатой кнопки и по иду вложить файл (source: "page-"+pageid+".qml")
Возможно есть и другое решение. Но если ид не получается взять, тогда создать все кнопки в ручную.
Записан
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #3 : Декабрь 15, 2016, 17:05 »

решил задачу через поле text самой кнопки.
Код:
            Button {
                id: p1
                text: "1"
                onClicked: {
                    pageid = text
                }
            }
Записан
navrocky
Moderator
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Декабрь 15, 2016, 22:49 »

На 1 экране будут расположены 52 кнопки. На 2 экране будет вложен через Loader{} файл соответствующий иду нажатой кнопки, 52 кнопки = 52 файла qml.

Ужас какой  Шокированный

1) Почему не ListView/GridView с делегатом-кнопкой и модель с настройками для каждой кнопки?
2) Эти 52 qml файла все разные? может быть это несколько разных с разными настройками? тогда настройки с именем файла поместить также в модель

Да и вообще когда на экране 52 кнопки - это уже повод бить тревогу. В нормальном дружественном интерфейсе такого быть точно не должно
« Последнее редактирование: Декабрь 15, 2016, 22:51 от navrocky » Записан

Гугль в помощь
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #5 : Декабрь 15, 2016, 23:01 »

Да и вообще когда на экране 52 кнопки - это уже повод бить тревогу. В нормальном дружественном интерфейсе такого быть точно не должно
Если только это не интерфейс калькулятора ))
Записан
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #6 : Декабрь 16, 2016, 10:42 »

1) Почему не ListView/GridView с делегатом-кнопкой и модель с настройками для каждой кнопки?
Не подумал, попробую, спасибо.

2) Эти 52 qml файла все разные? может быть это несколько разных с разными настройками? тогда настройки с именем файла поместить также в модель
Да, все файлы будут разные.
Записан
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #7 : Декабрь 16, 2016, 14:33 »

решил теперь вот так вопрос, через ComboBox
Код:
            ComboBox {
                id: zadaniye
                currentIndex: 0
                displayText: "Задание: " + currentText
                model: [
                    "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"
                ]
            }

            Button {
                id: p1
                text: "Открыть"
                onClicked: {
                    pageid = zadaniye.currentText
                    console.log("onClicked! pageid = " + pageid )
                    stack.push(comp2)
                }
            }
Записан
Отражение луны
Гость
« Ответ #8 : Декабрь 25, 2016, 02:53 »

Просто назначьте callbackи, это ж яваскрипт.
Записан
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #9 : Декабрь 25, 2016, 12:31 »

Просто назначьте callbackи, это ж яваскрипт.
это вы про какое сообщение? И куда их добавлять?
Вопрос уже решён, но всё равно интересно.
Записан
Отражение луны
Гость
« Ответ #10 : Декабрь 25, 2016, 19:29 »

Суть в том, что вы вольны ввести в кнопку var атрибут, куда можно будет подставить функцию, которая выполнится при нажатии кнопки. Скажем:
Код:
Button {
id: ...
property var clickFunction: function() {code here}
onClicked: clickFunction()
}
Таким образом у каждой кнопки будет своя личная click функция.
Не уверен, можно ли ссылку на функцию передать через модель (скорее всего можно), но даже если нет:
- можно хранить список функций в keyValue и вызывать их по indexу кнопки.
- можно легко создавать и убирать кнопки через createObject, и там уж вам точно никто не помешает назначать кнопкам любые атрибуты.  

В вашем случае можно так же легко задать в качестве property для кнопки путь к нужному файлу, и пустить все через один обработчик. Значение этой property легко цепляется к модели, которая еще и выглядеть будет человеческим образом, то есть можно будет прямо в ней определить все пути. Вижу, об этом тут уже написали.

Реализация зависит от результата, который нужно в итоге получить, я лишь накидал часть вариантов решения.
« Последнее редактирование: Декабрь 25, 2016, 19:34 от Komorebi » Записан
vebmaster
Новичок

Offline Offline

Сообщений: 47


Просмотр профиля
« Ответ #11 : Декабрь 25, 2016, 19:48 »

Komorebi, спасибо, тоже интересный вариант

Цитировать
- можно хранить список функций в keyValue и вызывать их по indexу кнопки.
откуда этот index взять? из модели?
Записан
Отражение луны
Гость
« Ответ #12 : Декабрь 25, 2016, 21:15 »

Он всегда есть в контексте делегата. Просто переменная.
Подробнее можно узнать тут: http://doc.qt.io/qt-5/qml-qtquick-repeater.html#delegate-prop
Обратите внимание, что есть еще и modelData, которая так же отлично подходит к данной ситуации (и которой я никогда не пользовался)
« Последнее редактирование: Декабрь 25, 2016, 21:17 от Komorebi » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 23.