为了为小部件中的拖放错误创建测试用例,QTreeView
我尝试模拟拖放鼠标移动行为。
我基本上选择了第一个元素QTreeView
并希望它拖放到第三个元素上。我通过使用QTest::mousePress
和的组合来做到这一点QTest::mouseMove
。最后当然应该有 a QTest::mouseRelease
,但我已经无法重现 mousePress 和 mouseMove。
这些是重现所需的步骤:
- 用户在第一个项目的中心移动鼠标
- 用户按下鼠标左键
- 用户按住鼠标左键并将鼠标移动到第三个项目的中心
- 用户释放鼠标左键
如果按照我可以看到的描述执行这些操作,则QTreeView
小部件会做出适当的反应,并指示特殊的高光和垂直线,以防项目将在项目之间移动。
不幸的是,我的自动化测试无法重现这种行为。似乎QTest::mousePress
按顺序调用会有所不同。也使用一对QTest::mousePress
andQTest::mouseMove
是不同的。
这是我的代码:
主文件
#include "TestObject.h"
#include <QTest>
QTEST_MAIN(TestObject)
测试对象.h
#include <QtTest/QtTest>
class TestObject : public QObject
{
Q_OBJECT
private slots:
void dragAndDrop();
};
测试对象.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();
}
鼠标移动器.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 };
};
鼠标移动器.cpp
#include "MouseMover.h"