-1

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

例如,这个main.qml中的名称“按钮” 。

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

我需要这些来识别混合 Qt/QML 应用程序中的 QML 对象,用于 cucumber-cpp 步骤实现,我已经有一个Helper::click(QString name). 我在这里提出了一个示例项目: https ://github.com/elsamuko/qml_demo

4

2 回答 2

0

我有一个解决方案,我可以使用。
首先我在mousePressEvent派生QQuickView类中实现。
然后findChildren<QObject*>QQuickView对象上,我可以找到并调试 QML 对象。奇怪的是,childAtchildren没有列出 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

于 2021-02-10T17:47:15.390 回答
-1

试试这个,它应该工作

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++ 插槽连接?

于 2021-02-05T11:50:35.040 回答