d
dmitry.maslov13. Juni 2018 14: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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

9
Evgenii Legotckoi
  • 13. Juni 2018 14:47

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

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

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

      Evgenii Legotckoi
      • 13. Juni 2018 14:54

      самой кнопке есть обработчик 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
        • 13. Juni 2018 14:54

        Есть вот такой набор кнопок, которые вот так обернуты. Я перекрываю все глобальным 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
          • 13. Juni 2018 15:08
          • (bearbeitet)

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

            Evgenii Legotckoi
            • 13. Juni 2018 15:16

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

            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
              • 13. Juni 2018 15:22

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

                Evgenii Legotckoi
                • 13. Juni 2018 15:31

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

                  d
                  • 13. Juni 2018 17:11

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

                    Kommentare

                    Nur autorisierte Benutzer können Kommentare posten.
                    Bitte Anmelden oder Registrieren
                    Letzte Kommentare
                    A
                    ALO1ZE19. Oktober 2024 08:19
                    Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь Максимов5. Oktober 2024 07:51
                    Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas55. Juli 2024 11:02
                    QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    k
                    kmssr8. Februar 2024 18:43
                    Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                    Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                    Jetzt im Forum diskutieren
                    J
                    JacobFib17. Oktober 2024 03:27
                    добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                    JW
                    Jhon Wick1. Oktober 2024 15:52
                    Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                    КГ
                    Кирилл Гусарев27. September 2024 09:09
                    Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                    F
                    Fynjy22. Juli 2024 04:15
                    при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                    Folgen Sie uns in sozialen Netzwerken