【问题标题】:Simulate clicked QML element from QTest从 QTest 模拟单击​​的 QML 元素
【发布时间】:2014-02-04 13:31:12
【问题描述】:

我正在使用 QTest,并希望在我的 UI 中的一个 QML 元素上模拟鼠标点击。 换句话说,我想在我的 QML 代码中从 C++ 触发 onClicked 信号处理程序?

这就是我的 QML 的样子:

import QtQuick 2.0

Rectangle
{
    objectName: "MessageRectangle"
    width: 360
    height: 360
    Text
    {
        objectName: "MessageText"
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }

    Rectangle
    {
        id: simplebutton
        objectName: "ChangeTextButton"
        color: "grey"
        width: 150; height: 75

        Text
        {
            id: buttonLabel
            anchors.centerIn: parent
            text: "button label"
        }

        MouseArea
        {
            id: buttonMouseArea
            objectName: "ChangeTextButtonMouseArea"
            anchors.fill: parent
            onClicked:
            {
                CppApi.setMessage( "Button Clicked" );
            }
        }
    }
}

展示我尝试过的所有不同解决方案有点困难。但我试图将一个从 QObject 派生的自己的类与 QML 项目连接起来并向它发送点击信号:

   QObject::connect( this, SIGNAL( clicked() ), pItem, SLOT( onClicked() ) );
   emit clicked();

我也试过这样调用:

QMetaObject::invokeMethod( pButton, "pressedChanged", Qt::DirectConnection );

pButton 是我在抓取名为 ChangeTextButtonMouseArea 的对象时得到的 QQuickItem。

我在这里发现了一些类似的问题。但不知何故,onClicked 似乎有些不同。如果我打印出从 QQuickItem 获得的 QMetaObject 中定义的所有方法,那么我找不到 onClicked 函数或 clicked 信号。

这个答案在某种程度上是正确的方向,但我要发送的信号不是我自己创建的: C++ SIGNAL to QML SLOT in Qt

我也发现了这个问题: How to simulate mouse clicks in QML? 但我只想触发特定 QML 对象的点击事件。我真的需要计算鼠标点击的坐标吗?这样做似乎有点复杂,因为 QML 项只知道与其父项的相对位置。

我在尝试一些不可能的事情吗?还是因为解决方法太明显了,所以在网上找不到答案?

【问题讨论】:

    标签: c++ qt unit-testing signals qml


    【解决方案1】:

    了解如何模拟项目的鼠标点击。将其张贴在这里以防其他人尝试这样做。其实很简单。使用计算坐标点击并使用 QTest 进行实际点击。

    void ClickItem( QQuickItem* pItem, QWindow* pRootWindow )
    {
       auto oPointF = pItem->mapToScene( QPoint( 0, 0 ) );
       auto oPoint = oPointF.toPoint();
       oPoint.rx() += pItem->width() / 2;
       oPoint.ry() += pItem->height() / 2;
       QTest::mouseClick( pRootWindow, Qt::LeftButton, Qt::NoModifier, oPoint );
     }
    

    【讨论】:

    • 一个问题:你是怎么得到QWindow的?
    • 这也适用于我的情况。在我的情况下,QWindow 来自qobject_cast<QQuickWindow *>( _qml.rootContext() ) - 其中QQmlApplicationEngine _qml
    猜你喜欢
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多