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
                    AD

                    C ++ - Test 004. Pointers, Arrays and Loops

                    • Result:50points,
                    • Rating points-4
                    m

                    C ++ - Test 004. Pointers, Arrays and Loops

                    • Result:80points,
                    • Rating points4
                    m

                    C ++ - Test 004. Pointers, Arrays and Loops

                    • Result:20points,
                    • Rating points-10
                    Last comments
                    i
                    innorwallNov. 15, 2024, 2:26 a.m.
                    Qt/C++ - Lesson 031. QCustomPlot – The build of charts with time buy generic priligy We can just chat, and we will not lose too much time anyway
                    i
                    innorwallNov. 15, 2024, 12:03 a.m.
                    Qt/C++ - Lesson 060. Configuring the appearance of the application in runtime I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
                    i
                    innorwallNov. 14, 2024, 5:07 p.m.
                    Circuit switching and packet data transmission networks Angioedema 1 priligy dapoxetine
                    i
                    innorwallNov. 14, 2024, 4:42 p.m.
                    How to Copy Files in Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                    i
                    innorwallNov. 14, 2024, 2:09 p.m.
                    Qt/C++ - Tutorial 068. Hello World using the CMAKE build system in CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                    Now discuss on the forum
                    i
                    innorwallNov. 14, 2024, 8:39 a.m.
                    добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                    i
                    innorwallNov. 11, 2024, 3:55 p.m.
                    Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                    9
                    9AnonimOct. 25, 2024, 2:10 p.m.
                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                    Follow us in social networks