我正在玩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" );
}
}
}
}
显示我尝试的所有不同解决方案有点困难。但我试图将从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函数或点击的信号。
这个答案在某种程度上是正确的方向,但我想发送的信号不是由我自己创建的: C++ SIGNAL to QML SLOT in Qt
我也发现了这个问题: How to simulate mouse clicks in QML? 但我只想在特定的QML对象上触发click事件。我真的需要计算鼠标点击的坐标吗?这样做似乎有点复杂,因为QML项目只知道他们父母的相对位置。
我在尝试一些不可能的事情吗?或者是我在互联网上找不到任何答案的原因,因为解决方案是如此明显?
答案 0 :(得分: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 );
}