Имитация движения мыши с использованием QTest
Я использую 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 ответ
Следующие изменения в void TestObject::testCode()
работают.
- Включить отслеживание мыши для виджета.
Добавьте задержку в тестовое событие отпускания мыши, в противном случае событие перемещения мыши кажется потерянным / запоздалым.
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);