c++ - 使用 QTest 模拟鼠标移动
问题描述
我QTest
用来测试简单的小部件,一切都按预期工作。但是现在我有一个更复杂的测试场景,我基本上有一个小部件,它允许用户按下鼠标按钮,然后移动一些内容,然后释放鼠标按钮。
为此,我创建了以下测试工具:
主文件
#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;
}
测试对象.h
#pragma once
#include <QObject>
class TestObject : public QObject
{
Q_OBJECT
private slots:
void testCode();
};
测试对象.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 文档在如何使用它方面也比较沉默。
如何模拟我想要的行为?
解决方案
以下更改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);
推荐阅读
- azure - Azure DevOps 组织 - 我们如何在 Azure DevOps 上购买更多构建时间
- caching - 直接映射缓存如何实现空间局部性?
- android - 如何使用 kotlin-dsl Gradle 插件从 Kotlin 1.2 迁移到 1.3?
- reactjs - 异步功能不等待继续
- node.js - 用于更新提供的字段的 Mongoose 路线
- android - 三星设备中的 SIGABRT 崩溃
- java - 如何在硒中单击伪:之前和伪:之后
- hadoop - 列 hive 中非重复记录的列表
- html - 两个 div 并排在右侧第三个内容上方
- android - 将第三方依赖项与 aar 文件一起发送