Имитация движения мыши с использованием QTest - PullRequest
2 голосов
/ 24 июня 2019

Я использую QTest для тестирования простых виджетов, и все работает как положено.Но теперь у меня есть более сложный сценарий тестирования, где у меня есть в основном виджет, который позволяет пользователю нажимать кнопку мыши, затем перемещать некоторый контент и затем отпускать кнопку мыши.

Для этого я создал следующий тестовый комплект:

main.cpp

#include <QtTest/QTest>
#include "TestObject.h"

int main(int argc, char** args) {
    TestObject o;
    QTest::qExec(&o);

}

WidgetToTest.h

#pragma once
#include <QWidget>

class WidgetToTest : public QWidget
{
    Q_OBJECT
public:
    WidgetToTest(QWidget* parent = nullptr);

protected:
    void mousePressEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
    void mouseReleaseEvent(QMouseEvent* event) override;
};

WidgetToTest.cpp

#include "WidgetToTest.h"
#include <QDebug>
#include <QMouseEvent>
#include <QHBoxLayout>

WidgetToTest::WidgetToTest(QWidget* parent): QWidget(parent)
{
    setFixedSize(200, 200);
    setLayout(new QHBoxLayout);
}

void WidgetToTest::mousePressEvent(QMouseEvent* event)
{
    qDebug() << "Mouse press: " << event;
}

void WidgetToTest::mouseMoveEvent(QMouseEvent* event)
{
    qDebug() << "Mouse move: "<< event; // Nothing happens here???
}

void WidgetToTest::mouseReleaseEvent(QMouseEvent* event)
{
    qDebug() << "Mouse release: " << event;
}

TestObject.h

#pragma once

#include <QObject>
class TestObject : public QObject
{
    Q_OBJECT

private slots:
    void testCode();
};

TestObject.cpp

#include "TestObject.h"
#include "WidgetToTest.h"
#include <QTest>
#include <QApplication>

void TestObject::testCode()
{
    int argc{0};
    QApplication app(argc,{});

    Qt::KeyboardModifiers mod;
    auto w = new WidgetToTest;
    w->show();
    QTest::mousePress(w, Qt::MouseButton::LeftButton,mod,QPoint(5,5));
    QTest::mouseMove(w, QPoint(20,20),20);
    QTest::mouseRelease(w, Qt::MouseButton::LeftButton,mod, QPoint(20,20));
}

Таким образом, пользователь нажимает левую кнопку мыши на позицию (5,5) внутри виджета, а затем перетаскивает мышь, удерживая кнопку в положении (20,20), где он отпускаеткнопка в положении (20,20).

Интересно, что событие перемещения никогда не происходит внутри виджета, и я действительно не знаю почему.

Похоже, что я не полностью понял намерение QTest::mouseMove, но документация Qt также довольно молчалива в том, как его использовать.

Как мне смоделировать желаемое поведение

1 Ответ

1 голос
/ 24 июня 2019

Работают следующие изменения в void TestObject::testCode().

  1. Включение отслеживания мыши для виджета.
  2. Добавление задержки к событию теста отпускания мыши, в противном случае событие перемещения мышикажется, заблудился / поздно.

    auto w = new WidgetToTest;
    w->setMouseTracking(true);
    w->show();
    QTest::mousePress(w, Qt::MouseButton::LeftButton,mod,QPoint(5,5));
    QTest::mouseMove(w, QPoint(20,20),20);
    QTest::mouseRelease(w, Qt::MouseButton::LeftButton,mod, QPoint(20,20),20);
    
...