使用QTest模拟鼠标移动

3
我将使用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),在那里释放按钮并松开鼠标。有趣的是,移动事件从未发生在小部件内,我真的不知道为什么。
看起来,我没有完全理解QTest :: mouseMove的意图,但Qt文档在如何使用它方面也相当缄默。
我该如何模拟所需的行为?

你尝试过移除 QTest::mouseMove 吗? - Silvano Cerza
1个回答

1
以下更改在 void TestObject::testCode() 中有效。
  1. Enable mouse tracking for the widget.
  2. Add delay to mouse release test event otherwise the mouse move event seems to get lost/late.

    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);
    

我认为那不是解决方案。如果您使用一个小部件,您会发现只有当鼠标按下小部件时才调用mouseMoveEvent,当激活鼠标跟踪标志时,您只需要光标在小部件上方(不需要按下小部件,仅足够悬停事件),而我认为OP不想测试它。对我来说这是一个错误。 - eyllanesc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接