Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
d
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);
}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
9

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

Если я правильно понял ваш код, то тогда все эти приколы с рекурсией вам будут не нужны.
1
d

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

0

самой кнопке есть обработчик 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);
    }


}
1
d

Есть вот такой набор кнопок, которые вот так обернуты. Я перекрываю все глобальным 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"
                }
            }
        }
1
d

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

0

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

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")
}
1
d

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

0

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

1
d

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

0

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
ПМ
18 марта 2019 г. 15:12
Пётр Махнёв

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

  • Результат:50баллов,
  • Очки рейтинга-4
ЯГ
18 марта 2019 г. 7:59
Ян Греку

C++ - Тест 003. Условия и циклы

  • Результат:21баллов,
  • Очки рейтинга-10
МД
15 марта 2019 г. 16:32
Михаил Дементьев

C++ - Тест 001. Первая программа и типы данных

  • Результат:60баллов,
  • Очки рейтинга-1
Последние комментарии
16 марта 2019 г. 13:55
Дмитрий

Спасибо за статью. Давно итересует следующий вопрос: с помощью переменных QMAKE_TARGET_COMPANYQMAKE_TARGET_PRODUCTQMAKE_TARGET_DESCRIPTIONможно задать свойства компилируемой программы, о...
JS
12 марта 2019 г. 10:19
Jean Stefanovich

Большое спасибо за разъяснения!
12 марта 2019 г. 10:04
Евгений Легоцкой

Hello, In fact, this functionality or is not implemented, or is not documented. I'm not sure. But I think, that it should be implemented in Text QML Type. Because of we can write text in...
12 марта 2019 г. 9:51
Евгений Легоцкой

Да вы правы. На самом деле проще через QSqlQueryModel, сколько не пытался использовать эти дженерики типо QSqlTableModel и QSqlRelationalTableModel, то всегда упирался в какие-то их ограничени...
JS
12 марта 2019 г. 9:47
Jean Stefanovich

Единицы измерения лежат там же где и названия продуктов. Просто в таблице ингредиенты нет ещё одного столбца, на который можно было бы установить setRelation. Я в итоге в базе создал ещё один ...
Сейчас обсуждают на форуме
17 марта 2019 г. 22:47
Евгений Легоцкой

Добрый день. Вот, нашлось у меня немного времени. Делается это через шаблон проектирования наблюдатель. GraphKS_mfvSlup.zip
ЧГ
15 марта 2019 г. 21:52
Чарльз Грин

спасибо, попробую, отпишусь
m
15 марта 2019 г. 19:41
mihamuz

Сори догадался)
n
12 марта 2019 г. 16:57
newbie.works.with.QT

Большооооое спасибо!!!!!Не передать как я вам благодарен, спасибо что всегда отзываетесь.Теперь я смогу продолжить работу в QT!!! (пробую писать бота (Я как вы могли догадаться немного не пр...
12 марта 2019 г. 13:20
BlinCT

Ну так если у вас есть готовая программа так ей и воспользуйтесь. Вы же написали ее вот и пользуйтесь.
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы