Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c++;? 我的主要目标是编写一个测试案例,可以模拟C++中的QML按钮点击。下面的代码段可以实现这一点,但它需要一个从qobject到qwindow的qobject\u cast()。是否有一个选项可以实现鼠标点击以获取qobject?这是实现按钮点击的正确方法还是有更好的方法_C++_Qt_Qml - Fatal编程技术网

在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: