从QTest模拟单击的QML元素

use*_*970 6 c++ qt unit-testing signals qml

我正在玩QTest并希望在我的测试中模拟鼠标点击我的UI中的一个QML元素. 换句话说,我想在C++的QML代码中触发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" );
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显示我尝试的所有不同解决方案有点困难.但是我尝试将从QObject派生的自己的类与QML项连接并向其发送单击信号:

   QObject::connect( this, SIGNAL( clicked() ), pItem, SLOT( onClicked() ) );
   emit clicked();
Run Code Online (Sandbox Code Playgroud)

我也尝试过以下方式:

QMetaObject::invokeMethod( pButton, "pressedChanged", Qt::DirectConnection );
Run Code Online (Sandbox Code Playgroud)

其中pButton是我获取名为ChangeTextButtonMouseArea的对象时获得的QQuickItem.

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

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

我还发现了这个问题: 如何在QML中模拟鼠标点击? 但我只想在特定的QML对象上触发click事件.我真的需要计算鼠标点击的坐标吗?这样做看起来有点复杂,因为QML项只知道他们父母的相对位置.

我在尝试一些不可能的事情吗?或者是我在互联网上找不到任何答案的原因,因为解决方案是如此明显?

use*_*970 6

找出如何模拟项目的鼠标单击.将其发布在此处以防其他人试图这样做.它实际上非常简单.使用计算坐标单击并使用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 );
 }
Run Code Online (Sandbox Code Playgroud)