Russian Qt Forum

Qt => Qt Quick => Тема начата: vebmaster от Декабрь 14, 2016, 19:55



Название: Как получить id текущего объекта/кнопки
Отправлено: vebmaster от Декабрь 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)
                }
            }


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: navrocky от Декабрь 15, 2016, 09:36
Сам по себе id существует только на этапе парсинга QML, далее он нигде не хранится, движок оперирует указателями на объекты.
Соответственно для динамически создаваемых объектов id не существует в принципе. Поэтому его получить нельзя.

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

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

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

Вывод:
qml: QObject(0x2390030)


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


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: vebmaster от Декабрь 15, 2016, 17:05
решил задачу через поле text самой кнопки.
Код:
            Button {
                id: p1
                text: "1"
                onClicked: {
                    pageid = text
                }
            }


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: navrocky от Декабрь 15, 2016, 22:49
На 1 экране будут расположены 52 кнопки. На 2 экране будет вложен через Loader{} файл соответствующий иду нажатой кнопки, 52 кнопки = 52 файла qml.

Ужас какой  :o

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

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


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: kai666_73 от Декабрь 15, 2016, 23:01
Да и вообще когда на экране 52 кнопки - это уже повод бить тревогу. В нормальном дружественном интерфейсе такого быть точно не должно
Если только это не интерфейс калькулятора ))


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: vebmaster от Декабрь 16, 2016, 10:42
1) Почему не ListView/GridView с делегатом-кнопкой и модель с настройками для каждой кнопки?
Не подумал, попробую, спасибо.

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


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: vebmaster от Декабрь 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)
                }
            }


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: Отражение луны от Декабрь 25, 2016, 02:53
Просто назначьте callbackи, это ж яваскрипт.


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: vebmaster от Декабрь 25, 2016, 12:31
Просто назначьте callbackи, это ж яваскрипт.
это вы про какое сообщение? И куда их добавлять?
Вопрос уже решён, но всё равно интересно.


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

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

Реализация зависит от результата, который нужно в итоге получить, я лишь накидал часть вариантов решения.


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: vebmaster от Декабрь 25, 2016, 19:48
Komorebi, спасибо, тоже интересный вариант

Цитировать
- можно хранить список функций в keyValue и вызывать их по indexу кнопки.
откуда этот index взять? из модели?


Название: Re: Как получить id текущего объекта/кнопки
Отправлено: Отражение луны от Декабрь 25, 2016, 21:15
Он всегда есть в контексте делегата. Просто переменная.
Подробнее можно узнать тут: http://doc.qt.io/qt-5/qml-qtquick-repeater.html#delegate-prop
Обратите внимание, что есть еще и modelData, которая так же отлично подходит к данной ситуации (и которой я никогда не пользовался)