Qt 如何获取单击的QML元素的objectName?

Qt 如何获取单击的QML元素的objectName?,qt,qml,mouseevent,objectname,Qt,Qml,Mouseevent,Objectname,我对一个相当大的QML代码库是新手,我想知道运行应用程序时单击的QML元素的属性,例如objectName 例如,本文件中的“按钮”名称 Qt中的等价物是QApplication::widgetAt()或QWidget::childAt()我可以在QMouseEvent中调用 我需要这些来识别Qt/QML混合应用程序中的QML对象,用于cucumber cpp步骤实现,其中我已经有了一个Helper::click(QString名称)。我在这里举了一个示例项目:试试这个,它应该可以工作 Rect

我对一个相当大的QML代码库是新手,我想知道运行应用程序时单击的QML元素的属性,例如objectName

例如,本文件中的“按钮”名称

Qt中的等价物是
QApplication::widgetAt()
QWidget::childAt()
我可以在QMouseEvent中调用


我需要这些来识别Qt/QML混合应用程序中的QML对象,用于cucumber cpp步骤实现,其中我已经有了一个
Helper::click(QString名称)
。我在这里举了一个示例项目:

试试这个,它应该可以工作

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发送一个信号,并在插槽中查找名称


我有一个解决方案,我可以使用。
首先,我在派生类中从
QQuickView
实现
mousePressEvent

然后使用
QQuickView
对象上的
findChildren
,我可以找到并调试QML对象。奇怪的是,
childAt
children
没有列出QML子对象

void ClickView::mousePressEvent(QMouseEvent*ev){
QObjectList children=this->findChildren(QRegularExpression(“.+”);
for(QObject*子对象:子对象){
//仅搜索QML类型
如果(!strstrstr(child->metaObject()->className(),“_QMLTYPE”){continue;}
QVariant vX=子->属性(“x”);
qvy=子->属性(“y”);
QVariant vW=子->属性(“宽度”);
QVariant vH=子->属性(“高度”);
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()请提供一个最简单的示例,演示您想要一个答案的框架Visible QML items have a childAt()方法和按钮继承了项,所以您应该能够调用它。QML项的函数
childAt
实际上相当于
QWidget::childAt
。但是如果您有重叠的对象,文档说它将只返回它找到的第一个子项,而这个子项可能不是您感兴趣的。我真的很怀疑您为什么想要它是功能性的。这对我来说可能是一个问题。@JarMan我更新了描述。我需要它来识别Qt/QML混合应用程序中用于UI测试的QML对象。那么,QML
childAt
函数是否能满足您的需要?反过来说,我没有“按钮”这个名称。这与代码
objectName:“按钮”中的示例相同
抱歉,我将
按钮更改为
按钮
@VahagnAvagyan您的代码获取
对象名
并找到指向该对象的指针。我想OP正在寻找找到
对象名
@JarMan的方法谢谢您的评论,我更新了我的答案,希望它能有所帮助