如何使用QTest模拟拖放操作

如何使用QTest模拟拖放操作,qt,qtreeview,qstandarditemmodel,qmouseevent,qtest,Qt,Qtreeview,Qstandarditemmodel,Qmouseevent,Qtest,为了在QTreeView小部件中创建拖放错误的测试用例,我尝试模拟拖放鼠标的移动行为 我基本上选择了QTreeView中的第一个元素,并希望将其拖放到第三个元素上。我是通过组合使用QTest::mousePress和QTest::mouseMove来实现的。最后当然应该有一个QTest::mousererelease,但我已经无法复制mousePress和mouseMove了 这些是复制的必要步骤: 用户在第一项的中心移动鼠标 用户按下鼠标左键 用户按住鼠标左键并将鼠标移动到第三项的中心 用户释

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

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

这些是复制的必要步骤:

  • 用户在第一项的中心移动鼠标
  • 用户按下鼠标左键
  • 用户按住鼠标左键并将鼠标移动到第三项的中心
  • 用户释放鼠标左键
  • 如果按照所述执行这些操作,我可以看到,
    QTreeView
    小部件会做出适当的反应,并指示特殊的突出显示和垂直线,以防项目在两个项目之间移动

    不幸的是,我的自动化测试无法重现这种行为。似乎按顺序调用
    QTest::mousePress
    会产生不同的效果。另外,使用一对
    QTest::mousePress
    QTest::mouseMove
    也是不同的

    这是我的代码:

    main.cpp

    #include "TestObject.h"
    #include <QTest>
    
    QTEST_MAIN(TestObject)
    
    #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();
    }
    
    #include "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 };
    };
    
    #include "MouseMover.h"