如何使用QTest模拟拖放动作

问题描述 投票:1回答:1

为了在QTreeView小部件中创建拖放错误的测试用例,我尝试模拟拖放鼠标的移动行为。

我基本上选择了QTreeView中的第一个元素,并希望将其拖放到第三个元素上。我通过结合使用QTest::mousePressQTest::mouseMove来完成此操作。最后当然应该有一个QTest::mouseRelease,但是我已经无法复制mousePress和mouseMove。

这些是复制所需的步骤:

  1. 用户将鼠标移到第一项的中央
  2. 用户按下鼠标左键
  3. 用户按住鼠标左键并将鼠标移到第三项的中央
  4. 用户释放鼠标左键

如果可以按照我所描述的那样执行这些操作,则QTreeView小部件会做出适当的反应,并指示特殊的突出显示和垂直线,以防项目在项目之间移动。

[不幸的是,我的自动化测试无法重现此行为。似乎依次调用QTest::mousePress会有所不同。同样使用一对QTest::mousePressQTest::mouseMove也有所不同。

这是我的代码:

main.cpp

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

QTEST_MAIN(TestObject)

TestObject.h

#include <QtTest/QtTest>

class TestObject : public QObject
{
    Q_OBJECT

private slots:
    void dragAndDrop();
};

TestObject.cpp

#include "TestObject.h"
#include "TestObject.moc"
#include <QTest>
#include <QTreeView>
#include <QStandardItemModel>
#include <QPropertyAnimation>
#include "MouseMover.h"

void TestObject::dragAndDrop() {
    qDebug() << "Hello";
    QStandardItemModel model;
    QTreeView view;
    view.setModel(&model);
    view.show();
    view.setHeaderHidden(true);
    view.setDragDropMode(QAbstractItemView::DragDropMode::DragDrop);
    view.setDefaultDropAction(Qt::DropAction::MoveAction);
    view.setColumnHidden(1, true);
    for (auto rowIter = 0; rowIter < 3; rowIter++) {
        QList<QStandardItem*> items;
        for (auto colIter = 0; colIter < 2; colIter++) {
            items << new QStandardItem(QString("%1-%2").arg(rowIter).arg(colIter));
        }
        model.appendRow(items);
    }

    MouseMover mover;
    mover.setWidget(view.viewport());
    QPropertyAnimation anim(&mover, "mousePosition");

    QTimer::singleShot(0, [&]() {
        auto startValue = view.visualRect(model.index(0, 0)).center();
        auto endValue = view.visualRect(model.index(2, 0)).center();

        QTest::mousePress(view.viewport(), Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier, startValue);
        anim.setStartValue(startValue);
        anim.setEndValue(endValue);
        anim.setDuration(500);
        anim.start();
    });
    qApp->exec();
}

MouseMover.h

#pragma once
#include <QObject>
#include <QTest>

class MouseMover : public QObject {
Q_OBJECT
public:
    Q_PROPERTY(QPoint mousePosition READ mousePosition WRITE setMousePosition MEMBER mMousePosition)

    void setWidget(QWidget* widget) {
        mWidget = widget;
    }
    QPoint mousePosition() const {
        return mMousePosition;
    }

    void setMousePosition(const QPoint& pos) {
        mMousePosition = pos;
        if (mWidget) {
            QTest::mousePress(mWidget, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier, mMousePosition);
            QTest::mouseMove(mWidget, mMousePosition);

        }
    }

private:
    QPoint mMousePosition;
    QWidget* mWidget{ nullptr };
};

MouseMover.cpp

#include "MouseMover.h"
qt qtreeview qstandarditemmodel qmouseevent qtest
1个回答
0
投票

尽管在python中,我也有类似的问题。到目前为止,当我在QPushButton上进行尽可能简单的测试(mousePress + mouseRelease)并检查是否确实单击了它时,此方法就可以了。但是,一旦我尝试使用mouseMove函数,似乎就无法正确拖动,因为在我的情况下它不会触发任何事件。

此另一个线程似乎有相同的问题:QTest, mousePress and mouseMove: Drag-and-Drop events are missing in Qt tests

[如果有人对如何使mousePress事件正常运行有任何见解,我也将很感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.