d
dmitry.maslovJune 13, 2018, 2:27 p.m.

Получить последний дочерний элемент по клику 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);
}
We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

9
Evgenii Legotckoi
  • June 13, 2018, 2:47 p.m.

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

Если я правильно понял ваш код, то тогда все эти приколы с рекурсией вам будут не нужны.
    d
    • June 13, 2018, 2:49 p.m.
    • (edited)

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

      Evgenii Legotckoi
      • June 13, 2018, 2:54 p.m.

      самой кнопке есть обработчик 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);
          }
      
      
      }
        d
        • June 13, 2018, 2:54 p.m.

        Есть вот такой набор кнопок, которые вот так обернуты. Я перекрываю все глобальным 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"
                        }
                    }
                }
          d
          • June 13, 2018, 3:08 p.m.
          • (edited)

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

            Evgenii Legotckoi
            • June 13, 2018, 3:16 p.m.

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

            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")
            }
              d
              • June 13, 2018, 3:22 p.m.

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

                Evgenii Legotckoi
                • June 13, 2018, 3:31 p.m.

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

                  d
                  • June 13, 2018, 5:11 p.m.

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

                    Comments

                    Only authorized users can post comments.
                    Please, Log in or Sign up
                    B

                    C++ - Test 002. Constants

                    • Result:16points,
                    • Rating points-10
                    B

                    C++ - Test 001. The first program and data types

                    • Result:46points,
                    • Rating points-6
                    FL

                    C++ - Test 006. Enumerations

                    • Result:80points,
                    • Rating points4
                    Last comments
                    k
                    kmssrFeb. 9, 2024, 7:43 a.m.
                    Qt Linux - Lesson 001. Autorun Qt application under Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                    Qt WinAPI - Lesson 007. Working with ICMP Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                    EVA
                    EVADec. 25, 2023, 11:30 p.m.
                    Boost - static linking in CMake project under Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                    J
                    JonnyJoDec. 25, 2023, 9:38 p.m.
                    Boost - static linking in CMake project under Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                    G
                    GvozdikDec. 19, 2023, 10:01 a.m.
                    Qt/C++ - Lesson 056. Connecting the Boost library in Qt for MinGW and MSVC compilers Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                    Now discuss on the forum
                    AC
                    Alexandru CodreanuJan. 20, 2024, 12:57 a.m.
                    QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
                    BlinCT
                    BlinCTDec. 27, 2023, 9:57 p.m.
                    Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
                    Дмитрий
                    ДмитрийJan. 10, 2024, 5:18 p.m.
                    Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
                    Evgenii Legotckoi
                    Evgenii LegotckoiDec. 12, 2023, 7:48 p.m.
                    Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

                    Follow us in social networks