© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
13 июня 2018 г. 18:27

Получить последний дочерний элемент по клику QML

с++, QML, qml

Есть форма. Состоящую из элементов. Мы перекрываем все MouseArea и при клике на кнопку, нам нужно получить объект этой кнопки, пропустив все перед ним слои. Как это сделать? Пример кода с рекурсией, но он не всегда срабатывает. cntnts - id Главного ITEM

onClicked: {
            var baz = cntnts.childAt(mouseX, mouseY);
            var itm =cntnts.childAt(mouseX, mouseY);
            while(true)
            {
                var X1 = mouseX
                var Y1 = mouseY
                console.log(itm.objectName);
                console.log(itm.children.length);
                console.log(itm.children[0]);
                console.log(baz.children[0].objectName);
                console.log(itm.childAt);
                if(itm.children.length>=0)
                {
                   baz = itm;
                   itm = itm.childAt(mouseX, mouseY);
                }
                else
                {
                    break;
                }
                if (itm.objectName === "BTNL")
                {
                    break;
                }

            }
            console.log(itm);
}

Вообще для таких целей (пропуск события клика на ниже лежащие слои) MouseArea имеет свойство propagateComposedEvents, которое по умолчанию выставлено на false, просто установите его в true и проверьте, как будет работать.

Если я правильно понял ваш код, то тогда все эти приколы с рекурсией вам будут не нужны.
  • #
  • отредактировано 13 июня 2018 г. 18:51
  • 13 июня 2018 г. 18:49

А как тогда сделать, если я установлю этот параметр? Что получить объект кнопки, которые Layout и не только

самой кнопке есть обработчик onClicked: в нем можете присовоить какой-нибудь глобальной property, этот объект, а потом уже играть с ним.

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 640
    height: 120
    title: qsTr("Hello World")

    id: root
    property Button currentButton: null

    function getButton(btn)
    {
        console.log(root.currentButton)
        root.currentButton = btn;
        console.log(root.currentButton)
    }


    Button {
        text: "button"
        onClicked: root.getButton(this);
    }


}

Есть вот такой набор кнопок, которые вот так обернуты. Я перекрываю все глобальным MouseArea и кликаю на одну из них. И мне нужно получить переменную в которой будет объект этой кнопки.

        Item{
            id: swipe_training
            anchors.top : parent.top
            anchors.left : parent.left
            anchors.right : parent.right
            anchors.bottom : swipe_training_indiccator.top

            objectName: "***Swipe"

            ColumnLayout{
                anchors.fill: parent
                objectName: "Column"
                Button
                {
                objectName: "BTNL"
                }
                Button
                {
                objectName: "BTNL"
                }
                Button
                {
                objectName: "BTNL"
                }
                Button
                {
                objectName: "BTNL"
                }
                Button
                {
                objectName: "BTNL"
                }
            }
        }
  • #
  • отредактировано 13 июня 2018 г. 19:09
  • 13 июня 2018 г. 19:08

на самом деле это всё нужно, чтобы сделать для программы контекстную справку: GUI перекрываем полупрозрачным/прозрачным Item, ловим координаты тапов на этом топовом Item, с помощью функции childAt сопостовляем координаты с тем, что лежит под тапом (контролы, view), и на item показываем плашку с подсказкой к тапнутому элементу. Собственно наша проблема: фукнция childAt не всегда выдаёт ссылки на нижележащие компоненты по координатам. По какому принципу и когда она выдёт ссылку на реальный компонент или возвращает пустую ссылку - мы не смогли разобраться. У нас есть предположение (мы ещё не успели проверить), что в отличие от виджетовского аналога, в qml функция childAt возвращает ссылки только первых потомков, а при большей вложенности она возвращает пустой указатель.

Ну вообще в документации так и написано, что возвращает первый видимый объект, то есть если какие-то невидимы, то они возвращаться не будут.

Returns the first visible child item found at point ( x , y ) within the coordinate system of this item.

Returns null if there is no such item.

И важный момент в том, что возвращается не контейнер с объектами, а именно один объект.

используйте метод children, чтобы получить список всех потомков и проверяйте, находится ли их rect в рамках тех координат, которые вы проверяете.

так же не забывайте про методы mapToItem, mapToGlobal, чтобы конвертнуть все координаты в одну систему координат, лучше в глобальную тогда.

А вообще для подсказок можно и тултипы испоьлзовать

Button {
    text: qsTr("Save")

    ToolTip.visible: down
    ToolTip.text: qsTr("Save the active project")
}

Спасибо вам от студентов Московского Политеха,  работаем на Qt по Проектной деятельности. Tooltip не можем использовать, так как задание - разработать кастомную систему справки.

Почитайте про attached property в QML, тогда сможете написать собственные tooltip`ы

мы не можем каждой кнопке добавлять ToolTip, так как их очень много и они будут добавляться. Задача: именно получить объект по клику на область, минуя вложенность

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
25 июня 2018 г. 11:55
lebendig

C++ - Тест 006. Перечисления

  • Результат 100 баллов
  • Очки рейтинга 10
25 июня 2018 г. 11:24
lebendig

C++ - Тест 005. Структуры и Классы

  • Результат 100 баллов
  • Очки рейтинга 10
25 июня 2018 г. 8:48
lebendig

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат 100 баллов
  • Очки рейтинга 10
Последние комментарии
25 июня 2018 г. 9:34
EVILEG

Как написать игру на Qt - Урок 4. Враг - смысл в выживании

Там неправильный подсчёт был по направлению и полный бардак был с поведением, эти 45 градусов исправляли ситуацию. Точную причину уже совсем не помню. А вообще все эти расчёты довольно...
25 июня 2018 г. 9:13
MarkSD

Как написать игру на Qt - Урок 4. Враг - смысл в выживании

Здравствуйте, Подскажите, пжлст, как работает этот код : QLineF lineToTarget(QPointF(0, 0), mapFromItem(target, 0, 0));  // Проводим линию от паука к мухе qreal angl...
25 июня 2018 г. 7:51
EVILEG

PyQt5 - Урок 003. QSystemTrayIcon - Как свернуть приложение в трей

Если не ошибаюсь, можно просто удалить вот эту строку central_widget.setLayout(grid_layout) Там указатель на парента передаётся в само размещение, что автоматически заменяет в размещен...
Сейчас обсуждают на форуме
25 июня 2018 г. 17:38
IscanderChe

Иконка исполняемого файла

Спасибо!
25 июня 2018 г. 13:12
Arrow

QComboBox и База данных

И если можно еще один вопрос. Таблицы во вложении. Если писать: mainModel = new QSqlRelationalTableModel(this);mainModel-&g...;
25 июня 2018 г. 7:49
EVILEG

На чём сделан этот сайт?

Добрый день! На сервере сайта установлена Ubuntu 16.04. В качестве сервера используется VDS. Хостинг-провайдер Timeweb . Сайт написан на Django/Python, для...
19 июня 2018 г. 7:56
EVILEG

как редактировать порядок обхода этементов по нажатию TAB в Qt5 qml

Что-то наподобие такого TextField { Keys.onReturnPressed: nextItemInFocusChain().forceActiveFocus()}

Рекомендуемые страницы