add tst_qquickwidget::synthMouseFromTouch test
Make sure events are delivered as expected and that synth-mouse events have the right source(). Task-number: QTBUG-64241 Change-Id: I95a073ce0faea2111c8e1aca42fa44c1b529a6ec Reviewed-by: Jan Arve Sæther <jan-arve.saether@qt.io>
This commit is contained in:
parent
fb84bcb487
commit
b483144d3a
|
@ -27,6 +27,7 @@
|
|||
****************************************************************************/
|
||||
|
||||
#include <qtest.h>
|
||||
#include <qtesttouch.h>
|
||||
#include <QtTest/QSignalSpy>
|
||||
#include <QtQml/qqmlcomponent.h>
|
||||
#include <QtQml/qqmlcontext.h>
|
||||
|
@ -37,9 +38,77 @@
|
|||
#include <QtGui/QImage>
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtQml/qqmlengine.h>
|
||||
|
||||
#include <QtCore/QLoggingCategory>
|
||||
#include <QtQuickWidgets/QQuickWidget>
|
||||
|
||||
Q_LOGGING_CATEGORY(lcTests, "qt.quick.tests")
|
||||
|
||||
class MouseRecordingQQWidget : public QQuickWidget
|
||||
{
|
||||
public:
|
||||
explicit MouseRecordingQQWidget(QWidget *parent = nullptr) : QQuickWidget(parent) {
|
||||
setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
}
|
||||
|
||||
protected:
|
||||
void mousePressEvent(QMouseEvent *event) override {
|
||||
qCDebug(lcTests) << event;
|
||||
m_mouseEvents << *event;
|
||||
QQuickWidget::mousePressEvent(event);
|
||||
}
|
||||
void mouseMoveEvent(QMouseEvent *event) override {
|
||||
qCDebug(lcTests) << event;
|
||||
m_mouseEvents << *event;
|
||||
QQuickWidget::mouseMoveEvent(event);
|
||||
}
|
||||
void mouseReleaseEvent(QMouseEvent *event) override {
|
||||
qCDebug(lcTests) << event;
|
||||
m_mouseEvents << *event;
|
||||
QQuickWidget::mouseReleaseEvent(event);
|
||||
}
|
||||
|
||||
public:
|
||||
QList<QMouseEvent> m_mouseEvents;
|
||||
};
|
||||
|
||||
class MouseRecordingItem : public QQuickItem
|
||||
{
|
||||
public:
|
||||
MouseRecordingItem(bool acceptTouch, QQuickItem *parent = nullptr)
|
||||
: QQuickItem(parent)
|
||||
, m_acceptTouch(acceptTouch)
|
||||
{
|
||||
setSize(QSizeF(300, 300));
|
||||
setAcceptedMouseButtons(Qt::LeftButton);
|
||||
}
|
||||
|
||||
protected:
|
||||
void touchEvent(QTouchEvent* event) override {
|
||||
event->setAccepted(m_acceptTouch);
|
||||
m_touchEvents << *event;
|
||||
qCDebug(lcTests) << "accepted?" << event->isAccepted() << event;
|
||||
}
|
||||
void mousePressEvent(QMouseEvent *event) override {
|
||||
qCDebug(lcTests) << event;
|
||||
m_mouseEvents << *event;
|
||||
}
|
||||
void mouseMoveEvent(QMouseEvent *event) override {
|
||||
qCDebug(lcTests) << event;
|
||||
m_mouseEvents << *event;
|
||||
}
|
||||
void mouseReleaseEvent(QMouseEvent *event) override {
|
||||
qCDebug(lcTests) << event;
|
||||
m_mouseEvents << *event;
|
||||
}
|
||||
|
||||
public:
|
||||
QList<QMouseEvent> m_mouseEvents;
|
||||
QList<QTouchEvent> m_touchEvents;
|
||||
|
||||
private:
|
||||
bool m_acceptTouch;
|
||||
};
|
||||
|
||||
class tst_qquickwidget : public QQmlDataTest
|
||||
{
|
||||
Q_OBJECT
|
||||
|
@ -63,8 +132,12 @@ private slots:
|
|||
void shortcuts();
|
||||
void enterLeave();
|
||||
void mouseEventWindowPos();
|
||||
};
|
||||
void synthMouseFromTouch_data();
|
||||
void synthMouseFromTouch();
|
||||
|
||||
private:
|
||||
QTouchDevice *device = QTest::createTouchDevice();
|
||||
};
|
||||
|
||||
tst_qquickwidget::tst_qquickwidget()
|
||||
{
|
||||
|
@ -462,6 +535,48 @@ void tst_qquickwidget::mouseEventWindowPos()
|
|||
QTRY_VERIFY(rootItem->property("wasMoved").toBool());
|
||||
}
|
||||
|
||||
void tst_qquickwidget::synthMouseFromTouch_data()
|
||||
{
|
||||
QTest::addColumn<bool>("synthMouse"); // AA_SynthesizeMouseForUnhandledTouchEvents
|
||||
QTest::addColumn<bool>("acceptTouch"); // QQuickItem::touchEvent: setAccepted()
|
||||
|
||||
QTest::newRow("no synth, accept") << false << true; // suitable for touch-capable UIs
|
||||
QTest::newRow("no synth, don't accept") << false << false;
|
||||
QTest::newRow("synth and accept") << true << true;
|
||||
QTest::newRow("synth, don't accept") << true << false; // the default
|
||||
}
|
||||
|
||||
void tst_qquickwidget::synthMouseFromTouch()
|
||||
{
|
||||
QFETCH(bool, synthMouse);
|
||||
QFETCH(bool, acceptTouch);
|
||||
|
||||
QCoreApplication::setAttribute(Qt::AA_SynthesizeMouseForUnhandledTouchEvents, synthMouse);
|
||||
QWidget window;
|
||||
window.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
QScopedPointer<MouseRecordingQQWidget> childView(new MouseRecordingQQWidget(&window));
|
||||
MouseRecordingItem *item = new MouseRecordingItem(acceptTouch, nullptr);
|
||||
childView->setContent(QUrl(), nullptr, item);
|
||||
window.resize(300, 300);
|
||||
childView->resize(300, 300);
|
||||
window.show();
|
||||
QVERIFY(QTest::qWaitForWindowActive(&window));
|
||||
QVERIFY(childView->quickWindow()->isVisible());
|
||||
QVERIFY(item->isVisible());
|
||||
|
||||
QPoint p1 = QPoint(20, 20);
|
||||
QPoint p2 = QPoint(30, 30);
|
||||
QTest::touchEvent(&window, device).press(0, p1, &window);
|
||||
QTest::touchEvent(&window, device).move(0, p2, &window);
|
||||
QTest::touchEvent(&window, device).release(0, p2, &window);
|
||||
|
||||
QCOMPARE(item->m_touchEvents.count(), 3);
|
||||
QCOMPARE(item->m_mouseEvents.count(), acceptTouch ? 0 : 3);
|
||||
QCOMPARE(childView->m_mouseEvents.count(), 0);
|
||||
for (const QMouseEvent &ev : item->m_mouseEvents)
|
||||
QCOMPARE(ev.source(), Qt::MouseEventSynthesizedByQt);
|
||||
}
|
||||
|
||||
QTEST_MAIN(tst_qquickwidget)
|
||||
|
||||
#include "tst_qquickwidget.moc"
|
||||
|
|
Loading…
Reference in New Issue