Skip to content

Commit

Permalink
add tst_qquickwidget::synthMouseFromTouch test
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
ec1oud committed Feb 3, 2018
1 parent fb84bcb commit b483144
Showing 1 changed file with 117 additions and 2 deletions.
119 changes: 117 additions & 2 deletions tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp
Expand Up @@ -27,6 +27,7 @@
****************************************************************************/

#include <qtest.h>
#include <qtesttouch.h>
#include <QtTest/QSignalSpy>
#include <QtQml/qqmlcomponent.h>
#include <QtQml/qqmlcontext.h>
Expand All @@ -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
Expand All @@ -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()
{
Expand Down Expand Up @@ -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"

0 comments on commit b483144

Please sign in to comment.