用QTest模拟点击QML元素

7

我正在使用QTest并希望在我的UI中模拟鼠标单击测试,触发其中一个QML元素上的onClicked信号处理程序。

换句话说,我想从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" );
            }
        }
    }
}

我尝试了很多不同的解决方案,但是有一种方式是连接一个从QObject派生出来的自己的类和QML项并向其发送click信号:

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

我也尝试了以下方式来调用:

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

当我抓取名为ChangeTextButtonMouseArea的对象时,pButton是我获得的QQuickItem。

我在这里找到了一些类似的问题。但是,某种程度上,onClicked似乎有所不同。如果我打印出从QQuickItem获取的QMetaObject中定义的所有方法,那么我找不到onClicked函数或clicked信号。

这个答案有点正确,但我想发送的信号并不是由我自己创建的: C++ SIGNAL to QML SLOT in Qt

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

我试图尝试一些不可能的事情吗?还是我找不到答案的原因是解决方案非常明显?

1个回答

7

发现如何模拟鼠标单击一个项目。在这里发布,以防其他人也在尝试这样做。实际上很简单。计算要单击的坐标,并使用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 - Halfgaar
这在我的情况下也起作用了。在我的情况下,QWindow来自于qobject_cast<QQuickWindow *>(_qml.rootContext())-其中QQmlApplicationEngine _qml - susundberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接