在c++;? 我的主要目标是编写一个测试案例,可以模拟C++中的QML按钮点击。下面的代码段可以实现这一点,但它需要一个从qobject到qwindow的qobject\u cast()。是否有一个选项可以实现鼠标点击以获取qobject?这是实现按钮点击的正确方法还是有更好的方法
在c++;? 我的主要目标是编写一个测试案例,可以模拟C++中的QML按钮点击。下面的代码段可以实现这一点,但它需要一个从qobject到qwindow的qobject\u cast()。是否有一个选项可以实现鼠标点击以获取qobject?这是实现按钮点击的正确方法还是有更好的方法,c++,qt,qml,C++,Qt,Qml,main.qml文件 import QtQuick 2.11 import QtQuick.Controls 2.2 import QtQuick.VirtualKeyboard 2.2 import QtQuick.Window 2.11 ApplicationWindow { id: window visible: true width: 640 height: 480 title: qsTr("Hello World") Button {
main.qml
文件
import QtQuick 2.11
import QtQuick.Controls 2.2
import QtQuick.VirtualKeyboard 2.2
import QtQuick.Window 2.11
ApplicationWindow {
id: window
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button {
id: button
objectName: "button"
x: 54
y: 118
text: qsTr("Button")
checkable: true
onClicked: {
button.text = qsTr("Clicked")
}
}
}
...
public:
void ClickItem(QObject*);
private slots:
void test_case1();
private:
QWindow *m_window;
...
void myClass::ClickItem(QObject* pItem)
{
int x = pItem->property("x").toInt();
int y = pItem->property("y").toInt();
QPoint location(x, y);
QTest::mouseClick(m_window, Qt::LeftButton, Qt::NoModifier, location);
}
void myClass::test_case1()
{
QObject *engine;
QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:../app/Display.qml")));
object = component.create();
m_window = qobject_case<QWindow *>(object);
QObject *item = object->findChild<QObject*>("button");
if (item) {
myClass::ClickItem(item);
QVariant value = item->property("text");
QCOMPARE(value.toString(), QString("Clicked"));
} else {
qDebug() << "Did not work";
}
}
myClass.h
文件
import QtQuick 2.11
import QtQuick.Controls 2.2
import QtQuick.VirtualKeyboard 2.2
import QtQuick.Window 2.11
ApplicationWindow {
id: window
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button {
id: button
objectName: "button"
x: 54
y: 118
text: qsTr("Button")
checkable: true
onClicked: {
button.text = qsTr("Clicked")
}
}
}
...
public:
void ClickItem(QObject*);
private slots:
void test_case1();
private:
QWindow *m_window;
...
void myClass::ClickItem(QObject* pItem)
{
int x = pItem->property("x").toInt();
int y = pItem->property("y").toInt();
QPoint location(x, y);
QTest::mouseClick(m_window, Qt::LeftButton, Qt::NoModifier, location);
}
void myClass::test_case1()
{
QObject *engine;
QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:../app/Display.qml")));
object = component.create();
m_window = qobject_case<QWindow *>(object);
QObject *item = object->findChild<QObject*>("button");
if (item) {
myClass::ClickItem(item);
QVariant value = item->property("text");
QCOMPARE(value.toString(), QString("Clicked"));
} else {
qDebug() << "Did not work";
}
}
myClass.cpp
文件
import QtQuick 2.11
import QtQuick.Controls 2.2
import QtQuick.VirtualKeyboard 2.2
import QtQuick.Window 2.11
ApplicationWindow {
id: window
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button {
id: button
objectName: "button"
x: 54
y: 118
text: qsTr("Button")
checkable: true
onClicked: {
button.text = qsTr("Clicked")
}
}
}
...
public:
void ClickItem(QObject*);
private slots:
void test_case1();
private:
QWindow *m_window;
...
void myClass::ClickItem(QObject* pItem)
{
int x = pItem->property("x").toInt();
int y = pItem->property("y").toInt();
QPoint location(x, y);
QTest::mouseClick(m_window, Qt::LeftButton, Qt::NoModifier, location);
}
void myClass::test_case1()
{
QObject *engine;
QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:../app/Display.qml")));
object = component.create();
m_window = qobject_case<QWindow *>(object);
QObject *item = object->findChild<QObject*>("button");
if (item) {
myClass::ClickItem(item);
QVariant value = item->property("text");
QCOMPARE(value.toString(), QString("Clicked"));
} else {
qDebug() << "Did not work";
}
}
void myClass::ClickItem(QObject*pItem)
{
intx=pItem->property(“x”).toInt();
int y=pItem->property(“y”).toInt();
点位置(x,y);
QTest::mouseClick(m_窗口,Qt::LeftButton,Qt::NoModifier,位置);
}
void myClass::test_case1()
{
QObject*引擎;
QQmlComponent组件(&引擎,QUrl(QStringLiteral(“qrc:../app/Display.qml”));
object=component.create();
m_window=qobject_case(对象);
QObject*item=object->findChild(“按钮”);
如果(项目){
myClass::ClickItem(项目);
QVariant value=项目->属性(“文本”);
QCOMPARE(value.toString(),QString(“单击”);
}否则{
qDebug()这似乎对我很有用:
QObject* obj = view.findChild<QObject*>("button");
QEvent evtPress(QEvent::MouseButtonPress);
QEvent evtRelease(QEvent::MouseButtonRelease);
obj->event(&evtPress);
obj->event(&evtRelease);
QObject*obj=view.findChild(“按钮”);
QEvent evtPress(QEvent::MouseButtonPress);
QEvent evtRelease(QEvent::鼠标按钮释放);
obj->事件(&evtPress);
obj->事件(&EVT租约);
好奇-你真的想模拟单击鼠标按钮,还是想测试用户正常单击该按钮时调用的代码?有一些框架是专门为通过模拟用户交互来测试UI而设计的。使用其中一种。你指的是qmltestcase和qt quick test之类的框架吗?什么我们在我的产品团队中这样做。每个QML元素都装饰有可访问性属性。然后我们在Windows和Mac上使用可访问性和系统API来定位控件、定位鼠标并模拟单击。其他框架做类似的事情和/或将自己插入调试器并执行类似的命令。特别是一个框架,我要知道,这一点特别适用于Qt: