Как получить имя объекта элементов QML, на которые я нажимаю?

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

Например. кнопку имени в этом main.qml.

Эквивалентом в Qt является QApplication::widgetAt() или QWidget::childAt(), который я могу вызвать в QMouseEvent.

Они нужны мне для идентификации объектов QML в смешанном приложении Qt/QML для реализации шага огурца-cpp, где у меня уже есть файл Helper::click(QString name). Я разместил пример проекта здесь: https://github.com/elsamuko/qml_demo


person elsamuko    schedule 28.01.2021    source источник
comment
Пожалуйста, предоставьте минимальный пример, демонстрирующий структуру, в которой вы хотите получить ответ.   -  person Amfasis    schedule 28.01.2021
comment
Видимые элементы QML имеют метод childAt(), а Button наследует Item, поэтому вы должны иметь возможность вызывать его.   -  person Jack Lilhammers    schedule 07.02.2021
comment
Функция childAt элемента QML действительно эквивалентна QWidget::childAt. Но если у вас есть перекрывающиеся объекты, в документах говорится, что он просто вернет первый найденный дочерний элемент, который может быть не тем, который вас интересует. Я действительно задаюсь вопросом, почему вам нужна эта функциональность. Мне кажется, что это может быть проблемой XY.   -  person JarMan    schedule 08.02.2021
comment
@JarMan Я обновил описание. Мне это нужно для идентификации объектов QML для тестирования пользовательского интерфейса в смешанном приложении Qt/QML.   -  person elsamuko    schedule 09.02.2021
comment
Хорошо, функция QML childAt делает то, что вы хотите?   -  person JarMan    schedule 09.02.2021
comment
Я добавил пользовательский класс ClickView для создания дампа QQuickItem*, где пользователь нажимает, но ни childAt, ни все остальные дочерние объекты не являются Button объектами.   -  person elsamuko    schedule 09.02.2021


Ответы (2)


У меня есть решение, с которым я могу работать.
Сначала я реализую mousePressEvent из QQuickView в производном классе.
Затем с помощью findChildren<QObject*> в объекте QQuickView я могу находить и отлаживать объекты QML. Как ни странно, childAt и children не перечисляют дочерние объекты QML.

void ClickView::mousePressEvent( QMouseEvent* ev ) {

    QObjectList children = this->findChildren<QObject*>( QRegularExpression( ".+" ) );

    for( QObject* child : children ) {

        // only search for QML types
        if( !strstr( child->metaObject()->className(), "_QMLTYPE_" ) ) { continue; }

        QVariant vX = child->property( "x" );
        QVariant vY = child->property( "y" );
        QVariant vW = child->property( "width" );
        QVariant vH = child->property( "height" );

        if( vX.isValid() && vY.isValid() && vW.isValid() && vH.isValid() ) {
            QRect rect( vX.toInt(), vY.toInt(), vW.toInt(), vH.toInt() );

            if( rect.contains( ev->pos() ) ) {
                qDebug() << child;
            }
        }
    }

    QQuickView::mousePressEvent( ev );
}

Полный проект находится здесь:
https://github.com/elsamuko/qml_demo

person elsamuko    schedule 10.02.2021

попробуй так, должно получиться

Rectangle {
    id: item
    signal qmlSignal(msg: string)
    objectName: "rectangle"

    MouseArea {
        anchors.fill: parent
        onClicked: item.qmlSignal("rectangle clicked")
        onDoubleClicked: item.qmlSignal("rectangle double clicked")
        onEntered: item.qmlSignal("mouse entered the rectangle")
        onExited: item.qmlSignal("mouse left the rectangle")
    }
}

если вас это не устраивает, то можно отправить сигнал из QML и узнать имя в слоте

Как подключить сигнал QML к слоту C++?

person Vahagn Avagyan    schedule 05.02.2021
comment
Наоборот, у меня нет имени Баттон. - person elsamuko; 05.02.2021
comment
это тот же пример из вашего кода objectName: "button" - person Vahagn Avagyan; 05.02.2021
comment
извините, я изменил Button на button - person Vahagn Avagyan; 05.02.2021
comment
@VaagnAvagyan Ваш код принимает objectName и находит указатель на объект. Я думаю, что ОП ищет способ найти objectName. - person JarMan; 05.02.2021
comment
@JarMan спасибо за комментарий, я обновил свой ответ, надеюсь, это поможет - person Vahagn Avagyan; 05.02.2021
comment
Это по-прежнему не дает мне информации об объектах QML, на которые я нажимаю. Предположим, я нахожусь в QApplication::event() и получаю QEvent::MouseButtonPress. Какой объект QML находится под курсором мыши. - person elsamuko; 06.02.2021
comment
@elsamuko я обновил ответ - person Vahagn Avagyan; 06.02.2021
comment
@VaagnAvagyan Это все еще не кажется мне полезным, извините. Я обновил описание и разместил здесь пример: github.com/elsamuko/qml_demo - person elsamuko; 09.02.2021