Reanimate test gui/kernel/qtouchevent/tst_qtouchevent.
Add CONFIG += testcase to the .pro file which was missing.
The test thus was never executed by make check and left to
rot.
Fix up code:
- Remove module includes.
- Introduce explicit constructors taking parent object
for helper classes, removing calls to setParent().
- Ensure test does not leak objects by converting pointers
to stack variables or introducing QScopedPointer, verify
by checking for an empty window list in cleanup().
- Simplify code by removing unneeded variables.
- Split up conditions in QVERIFY().
Fix tests:
- Show windows were required when events are sent to
QWidget::windowHandle().
- Invert the conditions checking whether touch events are
accepted by widgets since widgets no longer accept them
by defaults in Qt 5 after
e50416066c.
- XFAIL multiPointRawEventTranslationOnTouchPad()
which started to fail at some point in Qt 5.
- Mark as insignificant on OS X due to crash.
Task-number: QTBUG-46266
Change-Id: I6676d021afb015411a24d97d9b8f7c327d4d3c3f
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
bb10
parent
4964c89540
commit
0c5befa129
|
|
@ -1,3 +1,5 @@
|
|||
CONFIG += testcase
|
||||
osx: CONFIG += insignificant_test # QTBUG-46266, crashes
|
||||
SOURCES=tst_qtouchevent.cpp
|
||||
TARGET=tst_qtouchevent
|
||||
QT += testlib widgets gui-private
|
||||
|
|
|
|||
|
|
@ -31,11 +31,16 @@
|
|||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include <QtGui>
|
||||
#include <QtWidgets>
|
||||
#include <QtWidgets/QDesktopWidget>
|
||||
#include <QtWidgets/QGraphicsItem>
|
||||
#include <QtWidgets/QGraphicsScene>
|
||||
#include <QtWidgets/QGraphicsView>
|
||||
#include <QtWidgets/QGraphicsWidget>
|
||||
#include <QtWidgets/QWidget>
|
||||
#include <QtTest>
|
||||
#include <qpa/qwindowsysteminterface.h>
|
||||
|
||||
// FIXME: Use static functions of QWindowSystemInterface introduced with HighDPI scaling in 5.6 instead.
|
||||
static QWindowSystemInterface::TouchPoint touchPoint(const QTouchEvent::TouchPoint& pt)
|
||||
{
|
||||
QWindowSystemInterface::TouchPoint p;
|
||||
|
|
@ -72,8 +77,7 @@ public:
|
|||
ulong timestamp;
|
||||
QTouchDevice *deviceFromEvent;
|
||||
|
||||
tst_QTouchEventWidget()
|
||||
: QWidget()
|
||||
explicit tst_QTouchEventWidget(QWidget *parent = Q_NULLPTR) : QWidget(parent)
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
|
@ -88,7 +92,7 @@ public:
|
|||
deleteInTouchBegin = deleteInTouchUpdate = deleteInTouchEnd = false;
|
||||
}
|
||||
|
||||
bool event(QEvent *event)
|
||||
bool event(QEvent *event) Q_DECL_OVERRIDE
|
||||
{
|
||||
switch (event->type()) {
|
||||
case QEvent::TouchBegin:
|
||||
|
|
@ -142,8 +146,8 @@ public:
|
|||
bool deleteInTouchBegin, deleteInTouchUpdate, deleteInTouchEnd;
|
||||
tst_QTouchEventGraphicsItem **weakpointer;
|
||||
|
||||
tst_QTouchEventGraphicsItem()
|
||||
: QGraphicsItem(), weakpointer(0)
|
||||
explicit tst_QTouchEventGraphicsItem(QGraphicsItem *parent = Q_NULLPTR)
|
||||
: QGraphicsItem(parent), weakpointer(0)
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
|
@ -165,10 +169,10 @@ public:
|
|||
deleteInTouchBegin = deleteInTouchUpdate = deleteInTouchEnd = false;
|
||||
}
|
||||
|
||||
QRectF boundingRect() const { return QRectF(0, 0, 10, 10); }
|
||||
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) { }
|
||||
QRectF boundingRect() const Q_DECL_OVERRIDE { return QRectF(0, 0, 10, 10); }
|
||||
void paint(QPainter *, const QStyleOptionGraphicsItem *, QWidget *) Q_DECL_OVERRIDE { }
|
||||
|
||||
bool sceneEvent(QEvent *event)
|
||||
bool sceneEvent(QEvent *event) Q_DECL_OVERRIDE
|
||||
{
|
||||
switch (event->type()) {
|
||||
case QEvent::TouchBegin:
|
||||
|
|
@ -214,9 +218,9 @@ class tst_QTouchEvent : public QObject
|
|||
Q_OBJECT
|
||||
public:
|
||||
tst_QTouchEvent();
|
||||
~tst_QTouchEvent() { }
|
||||
|
||||
private slots:
|
||||
void cleanup();
|
||||
void touchDisabledByDefault();
|
||||
void touchEventAcceptedByDefault();
|
||||
void touchBeginPropagatesWhenIgnored();
|
||||
|
|
@ -236,15 +240,18 @@ private:
|
|||
QTouchDevice *touchPadDevice;
|
||||
};
|
||||
|
||||
tst_QTouchEvent::tst_QTouchEvent()
|
||||
tst_QTouchEvent::tst_QTouchEvent() : touchScreenDevice(new QTouchDevice), touchPadDevice(new QTouchDevice)
|
||||
{
|
||||
touchScreenDevice = new QTouchDevice;
|
||||
touchPadDevice = new QTouchDevice;
|
||||
touchPadDevice->setType(QTouchDevice::TouchPad);
|
||||
QWindowSystemInterface::registerTouchDevice(touchScreenDevice);
|
||||
QWindowSystemInterface::registerTouchDevice(touchPadDevice);
|
||||
}
|
||||
|
||||
void tst_QTouchEvent::cleanup()
|
||||
{
|
||||
QVERIFY(QGuiApplication::topLevelWindows().isEmpty());
|
||||
}
|
||||
|
||||
void tst_QTouchEvent::touchDisabledByDefault()
|
||||
{
|
||||
// QWidget
|
||||
|
|
@ -261,8 +268,7 @@ void tst_QTouchEvent::touchDisabledByDefault()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointPressed,
|
||||
touchPoints);
|
||||
bool res = QApplication::sendEvent(&widget, &touchEvent);
|
||||
QVERIFY(!res);
|
||||
QVERIFY(!QApplication::sendEvent(&widget, &touchEvent));
|
||||
QVERIFY(!touchEvent.isAccepted());
|
||||
}
|
||||
|
||||
|
|
@ -290,8 +296,7 @@ void tst_QTouchEvent::touchDisabledByDefault()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointPressed,
|
||||
(QList<QTouchEvent::TouchPoint>() << touchPoint));
|
||||
bool res = QApplication::sendEvent(view.viewport(), &touchEvent);
|
||||
QVERIFY(!res);
|
||||
QVERIFY(!QApplication::sendEvent(view.viewport(), &touchEvent));
|
||||
QVERIFY(!touchEvent.isAccepted());
|
||||
QVERIFY(!item.seenTouchBegin);
|
||||
}
|
||||
|
|
@ -299,7 +304,7 @@ void tst_QTouchEvent::touchDisabledByDefault()
|
|||
|
||||
void tst_QTouchEvent::touchEventAcceptedByDefault()
|
||||
{
|
||||
if (qApp->platformName().toLower() == QLatin1String("wayland"))
|
||||
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||
QSKIP("Wayland: This fails. Figure out why.");
|
||||
|
||||
// QWidget
|
||||
|
|
@ -317,16 +322,14 @@ void tst_QTouchEvent::touchEventAcceptedByDefault()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointPressed,
|
||||
touchPoints);
|
||||
bool res = QApplication::sendEvent(&widget, &touchEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(touchEvent.isAccepted());
|
||||
QVERIFY(QApplication::sendEvent(&widget, &touchEvent));
|
||||
QVERIFY(!touchEvent.isAccepted()); // Qt 5.X ignores touch events.
|
||||
|
||||
// tst_QTouchEventWidget does handle, sending succeeds
|
||||
tst_QTouchEventWidget touchWidget;
|
||||
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
touchEvent.ignore();
|
||||
res = QApplication::sendEvent(&touchWidget, &touchEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(&touchWidget, &touchEvent));
|
||||
QVERIFY(touchEvent.isAccepted());
|
||||
}
|
||||
|
||||
|
|
@ -355,8 +358,7 @@ void tst_QTouchEvent::touchEventAcceptedByDefault()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointPressed,
|
||||
(QList<QTouchEvent::TouchPoint>() << touchPoint));
|
||||
bool res = QApplication::sendEvent(view.viewport(), &touchEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchEvent));
|
||||
QVERIFY(touchEvent.isAccepted());
|
||||
QVERIFY(item.seenTouchBegin);
|
||||
}
|
||||
|
|
@ -383,8 +385,7 @@ void tst_QTouchEvent::touchBeginPropagatesWhenIgnored()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointPressed,
|
||||
touchPoints);
|
||||
bool res = QApplication::sendEvent(&grandchild, &touchEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(&grandchild, &touchEvent));
|
||||
QVERIFY(touchEvent.isAccepted());
|
||||
QVERIFY(grandchild.seenTouchBegin);
|
||||
QVERIFY(child.seenTouchBegin);
|
||||
|
|
@ -398,8 +399,7 @@ void tst_QTouchEvent::touchBeginPropagatesWhenIgnored()
|
|||
grandchild.setAttribute(Qt::WA_AcceptTouchEvents, false);
|
||||
|
||||
touchEvent.ignore();
|
||||
res = QApplication::sendEvent(&grandchild, &touchEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(&grandchild, &touchEvent));
|
||||
QVERIFY(touchEvent.isAccepted());
|
||||
QVERIFY(!grandchild.seenTouchBegin);
|
||||
QVERIFY(child.seenTouchBegin);
|
||||
|
|
@ -435,8 +435,7 @@ void tst_QTouchEvent::touchBeginPropagatesWhenIgnored()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointPressed,
|
||||
(QList<QTouchEvent::TouchPoint>() << touchPoint));
|
||||
bool res = QApplication::sendEvent(view.viewport(), &touchEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchEvent));
|
||||
QVERIFY(touchEvent.isAccepted());
|
||||
QVERIFY(grandchild.seenTouchBegin);
|
||||
QVERIFY(child.seenTouchBegin);
|
||||
|
|
@ -471,8 +470,7 @@ void tst_QTouchEvent::touchBeginPropagatesWhenIgnored()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointPressed,
|
||||
(QList<QTouchEvent::TouchPoint>() << touchPoint));
|
||||
bool res = QApplication::sendEvent(view.viewport(), &touchEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchEvent));
|
||||
QVERIFY(touchEvent.isAccepted());
|
||||
QVERIFY(!grandchild.seenTouchBegin);
|
||||
QVERIFY(child.seenTouchBegin);
|
||||
|
|
@ -499,8 +497,7 @@ void tst_QTouchEvent::touchUpdateAndEndNeverPropagate()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointPressed,
|
||||
touchPoints);
|
||||
bool res = QApplication::sendEvent(&child, &touchBeginEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(&child, &touchBeginEvent));
|
||||
QVERIFY(touchBeginEvent.isAccepted());
|
||||
QVERIFY(child.seenTouchBegin);
|
||||
QVERIFY(!window.seenTouchBegin);
|
||||
|
|
@ -511,8 +508,7 @@ void tst_QTouchEvent::touchUpdateAndEndNeverPropagate()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointMoved,
|
||||
touchPoints);
|
||||
res = QApplication::sendEvent(&child, &touchUpdateEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(&child, &touchUpdateEvent));
|
||||
QVERIFY(!touchUpdateEvent.isAccepted());
|
||||
QVERIFY(child.seenTouchUpdate);
|
||||
QVERIFY(!window.seenTouchUpdate);
|
||||
|
|
@ -523,8 +519,7 @@ void tst_QTouchEvent::touchUpdateAndEndNeverPropagate()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointReleased,
|
||||
touchPoints);
|
||||
res = QApplication::sendEvent(&child, &touchEndEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(&child, &touchEndEvent));
|
||||
QVERIFY(!touchEndEvent.isAccepted());
|
||||
QVERIFY(child.seenTouchEnd);
|
||||
QVERIFY(!window.seenTouchEnd);
|
||||
|
|
@ -558,8 +553,7 @@ void tst_QTouchEvent::touchUpdateAndEndNeverPropagate()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointPressed,
|
||||
(QList<QTouchEvent::TouchPoint>() << touchPoint));
|
||||
bool res = QApplication::sendEvent(view.viewport(), &touchBeginEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchBeginEvent));
|
||||
QVERIFY(touchBeginEvent.isAccepted());
|
||||
QVERIFY(child.seenTouchBegin);
|
||||
QVERIFY(!root.seenTouchBegin);
|
||||
|
|
@ -571,8 +565,7 @@ void tst_QTouchEvent::touchUpdateAndEndNeverPropagate()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointMoved,
|
||||
(QList<QTouchEvent::TouchPoint>() << touchPoint));
|
||||
res = QApplication::sendEvent(view.viewport(), &touchUpdateEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchUpdateEvent));
|
||||
// the scene accepts the event, since it found an item to send the event to
|
||||
QVERIFY(!touchUpdateEvent.isAccepted());
|
||||
QVERIFY(child.seenTouchUpdate);
|
||||
|
|
@ -585,8 +578,7 @@ void tst_QTouchEvent::touchUpdateAndEndNeverPropagate()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointReleased,
|
||||
(QList<QTouchEvent::TouchPoint>() << touchPoint));
|
||||
res = QApplication::sendEvent(view.viewport(), &touchEndEvent);
|
||||
QVERIFY(res);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchEndEvent));
|
||||
// the scene accepts the event, since it found an item to send the event to
|
||||
QVERIFY(!touchEndEvent.isAccepted());
|
||||
QVERIFY(child.seenTouchEnd);
|
||||
|
|
@ -601,17 +593,20 @@ QPointF normalized(const QPointF &pos, const QRectF &rect)
|
|||
|
||||
void tst_QTouchEvent::basicRawEventTranslation()
|
||||
{
|
||||
if (qApp->platformName().toLower() == QLatin1String("wayland"))
|
||||
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||
QSKIP("Wayland: This fails. Figure out why.");
|
||||
|
||||
tst_QTouchEventWidget touchWidget;
|
||||
touchWidget.setWindowTitle(QTest::currentTestFunction());
|
||||
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
touchWidget.setGeometry(100, 100, 400, 300);
|
||||
touchWidget.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&touchWidget));
|
||||
|
||||
QPointF pos = touchWidget.rect().center();
|
||||
QPointF screenPos = touchWidget.mapToGlobal(pos.toPoint());
|
||||
QPointF delta(10, 10);
|
||||
QRectF screenGeometry = qApp->desktop()->screenGeometry(&touchWidget);
|
||||
QRectF screenGeometry = QApplication::desktop()->screenGeometry(&touchWidget);
|
||||
|
||||
QTouchEvent::TouchPoint rawTouchPoint;
|
||||
rawTouchPoint.setId(0);
|
||||
|
|
@ -726,24 +721,24 @@ void tst_QTouchEvent::basicRawEventTranslation()
|
|||
|
||||
void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
|
||||
{
|
||||
if (qApp->platformName().toLower() == QLatin1String("wayland"))
|
||||
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||
QSKIP("Wayland: This fails. Figure out why.");
|
||||
|
||||
tst_QTouchEventWidget touchWidget;
|
||||
touchWidget.setWindowTitle(QTest::currentTestFunction());
|
||||
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
touchWidget.setGeometry(100, 100, 400, 300);
|
||||
|
||||
tst_QTouchEventWidget leftWidget;
|
||||
leftWidget.setParent(&touchWidget);
|
||||
tst_QTouchEventWidget leftWidget(&touchWidget);
|
||||
leftWidget.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
leftWidget.setGeometry(0, 100, 100, 100);
|
||||
leftWidget.show();
|
||||
|
||||
tst_QTouchEventWidget rightWidget;
|
||||
rightWidget.setParent(&touchWidget);
|
||||
tst_QTouchEventWidget rightWidget(&touchWidget);
|
||||
rightWidget.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
rightWidget.setGeometry(300, 100, 100, 100);
|
||||
rightWidget.show();
|
||||
|
||||
touchWidget.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&touchWidget));
|
||||
|
||||
QPointF leftPos = leftWidget.rect().center();
|
||||
QPointF rightPos = rightWidget.rect().center();
|
||||
|
|
@ -751,8 +746,7 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
|
|||
QPointF leftScreenPos = leftWidget.mapToGlobal(leftPos.toPoint());
|
||||
QPointF rightScreenPos = rightWidget.mapToGlobal(rightPos.toPoint());
|
||||
QPointF centerScreenPos = touchWidget.mapToGlobal(centerPos.toPoint());
|
||||
QPointF delta(10, 10);
|
||||
QRectF screenGeometry = qApp->desktop()->screenGeometry(&touchWidget);
|
||||
QRectF screenGeometry = QApplication::desktop()->screenGeometry(&touchWidget);
|
||||
|
||||
QList<QTouchEvent::TouchPoint> rawTouchPoints;
|
||||
rawTouchPoints.append(QTouchEvent::TouchPoint(0));
|
||||
|
|
@ -956,24 +950,25 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchScreen()
|
|||
|
||||
void tst_QTouchEvent::multiPointRawEventTranslationOnTouchPad()
|
||||
{
|
||||
if (qApp->platformName().toLower() == QLatin1String("wayland"))
|
||||
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||
QSKIP("Wayland: This fails. Figure out why.");
|
||||
|
||||
tst_QTouchEventWidget touchWidget;
|
||||
touchWidget.setWindowTitle(QTest::currentTestFunction());
|
||||
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
touchWidget.setGeometry(100, 100, 400, 300);
|
||||
|
||||
tst_QTouchEventWidget leftWidget;
|
||||
leftWidget.setParent(&touchWidget);
|
||||
tst_QTouchEventWidget leftWidget(&touchWidget);
|
||||
leftWidget.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
leftWidget.setGeometry(0, 100, 100, 100);
|
||||
leftWidget.show();
|
||||
leftWidget.acceptTouchBegin =true;
|
||||
|
||||
tst_QTouchEventWidget rightWidget;
|
||||
rightWidget.setParent(&touchWidget);
|
||||
tst_QTouchEventWidget rightWidget(&touchWidget);
|
||||
rightWidget.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
rightWidget.setGeometry(300, 100, 100, 100);
|
||||
rightWidget.show();
|
||||
|
||||
touchWidget.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&touchWidget));
|
||||
|
||||
QPointF leftPos = leftWidget.rect().center();
|
||||
QPointF rightPos = rightWidget.rect().center();
|
||||
|
|
@ -981,8 +976,7 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchPad()
|
|||
QPointF leftScreenPos = leftWidget.mapToGlobal(leftPos.toPoint());
|
||||
QPointF rightScreenPos = rightWidget.mapToGlobal(rightPos.toPoint());
|
||||
QPointF centerScreenPos = touchWidget.mapToGlobal(centerPos.toPoint());
|
||||
QPointF delta(10, 10);
|
||||
QRectF screenGeometry = qApp->desktop()->screenGeometry(&touchWidget);
|
||||
QRectF screenGeometry = QApplication::desktop()->screenGeometry(&touchWidget);
|
||||
|
||||
QList<QTouchEvent::TouchPoint> rawTouchPoints;
|
||||
rawTouchPoints.append(QTouchEvent::TouchPoint(0));
|
||||
|
|
@ -1003,7 +997,8 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchPad()
|
|||
QVERIFY(!touchWidget.seenTouchBegin);
|
||||
QVERIFY(!touchWidget.seenTouchUpdate);
|
||||
QVERIFY(!touchWidget.seenTouchEnd);
|
||||
QVERIFY(leftWidget.seenTouchBegin);
|
||||
QEXPECT_FAIL("", "QTBUG-46266, fails in Qt 5", Abort);
|
||||
QVERIFY(!leftWidget.seenTouchBegin);
|
||||
QVERIFY(!leftWidget.seenTouchUpdate);
|
||||
QVERIFY(!leftWidget.seenTouchEnd);
|
||||
QVERIFY(!rightWidget.seenTouchBegin);
|
||||
|
|
@ -1186,19 +1181,15 @@ void tst_QTouchEvent::multiPointRawEventTranslationOnTouchPad()
|
|||
|
||||
void tst_QTouchEvent::deleteInEventHandler()
|
||||
{
|
||||
if (qApp->platformName().toLower() == QLatin1String("wayland"))
|
||||
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||
QSKIP("Wayland: This fails. Figure out why.");
|
||||
|
||||
// QWidget
|
||||
{
|
||||
QWidget window;
|
||||
tst_QTouchEventWidget *child1, *child2, *child3;
|
||||
child1 = new tst_QTouchEventWidget;
|
||||
child2 = new tst_QTouchEventWidget;
|
||||
child3 = new tst_QTouchEventWidget;
|
||||
child1->setParent(&window);
|
||||
child2->setParent(&window);
|
||||
child3->setParent(&window);
|
||||
QPointer<tst_QTouchEventWidget> child1 = new tst_QTouchEventWidget(&window);
|
||||
QPointer<tst_QTouchEventWidget> child2 = new tst_QTouchEventWidget(&window);
|
||||
QPointer<tst_QTouchEventWidget> child3 = new tst_QTouchEventWidget(&window);
|
||||
child1->setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
child2->setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
child3->setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
|
|
@ -1223,47 +1214,43 @@ void tst_QTouchEvent::deleteInEventHandler()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointReleased,
|
||||
touchPoints);
|
||||
QPointer<QWidget> p;
|
||||
bool res;
|
||||
|
||||
touchBeginEvent.ignore();
|
||||
p = child1;
|
||||
res = QApplication::sendEvent(child1, &touchBeginEvent);
|
||||
QVERIFY(QApplication::sendEvent(child1, &touchBeginEvent));
|
||||
// event is handled, but widget should be deleted
|
||||
QVERIFY(res && touchBeginEvent.isAccepted() && p.isNull());
|
||||
QVERIFY(touchBeginEvent.isAccepted());
|
||||
QVERIFY(child1.isNull());
|
||||
|
||||
touchBeginEvent.ignore();
|
||||
p = child2;
|
||||
res = QApplication::sendEvent(child2, &touchBeginEvent);
|
||||
QVERIFY(res && touchBeginEvent.isAccepted() && !p.isNull());
|
||||
QVERIFY(QApplication::sendEvent(child2, &touchBeginEvent));
|
||||
QVERIFY(touchBeginEvent.isAccepted());
|
||||
QVERIFY(!child2.isNull());
|
||||
touchUpdateEvent.ignore();
|
||||
res = QApplication::sendEvent(child2, &touchUpdateEvent);
|
||||
QVERIFY(res && touchUpdateEvent.isAccepted() && p.isNull());
|
||||
QVERIFY(QApplication::sendEvent(child2, &touchUpdateEvent));
|
||||
QVERIFY(touchUpdateEvent.isAccepted());
|
||||
QVERIFY(child2.isNull());
|
||||
|
||||
touchBeginEvent.ignore();
|
||||
p = child3;
|
||||
res = QApplication::sendEvent(child3, &touchBeginEvent);
|
||||
QVERIFY(res && touchBeginEvent.isAccepted() && !p.isNull());
|
||||
QVERIFY(QApplication::sendEvent(child3, &touchBeginEvent));
|
||||
QVERIFY(touchBeginEvent.isAccepted());
|
||||
QVERIFY(!child3.isNull());
|
||||
touchUpdateEvent.ignore();
|
||||
res = QApplication::sendEvent(child3, &touchUpdateEvent);
|
||||
QVERIFY(res && touchUpdateEvent.isAccepted() && !p.isNull());
|
||||
QVERIFY(QApplication::sendEvent(child3, &touchUpdateEvent));
|
||||
QVERIFY(touchUpdateEvent.isAccepted());
|
||||
QVERIFY(!child3.isNull());
|
||||
touchEndEvent.ignore();
|
||||
res = QApplication::sendEvent(child3, &touchEndEvent);
|
||||
QVERIFY(res && touchEndEvent.isAccepted() && p.isNull());
|
||||
QVERIFY(QApplication::sendEvent(child3, &touchEndEvent));
|
||||
QVERIFY(touchEndEvent.isAccepted());
|
||||
QVERIFY(child3.isNull());
|
||||
}
|
||||
|
||||
// QGraphicsView
|
||||
{
|
||||
QGraphicsScene scene;
|
||||
QGraphicsView view(&scene);
|
||||
tst_QTouchEventGraphicsItem *root, *child1, *child2, *child3;
|
||||
root = new tst_QTouchEventGraphicsItem;
|
||||
child1 = new tst_QTouchEventGraphicsItem;
|
||||
child2 = new tst_QTouchEventGraphicsItem;
|
||||
child3 = new tst_QTouchEventGraphicsItem;
|
||||
child1->setParentItem(root);
|
||||
child2->setParentItem(root);
|
||||
child3->setParentItem(root);
|
||||
QScopedPointer<tst_QTouchEventGraphicsItem> root(new tst_QTouchEventGraphicsItem);
|
||||
tst_QTouchEventGraphicsItem *child1 = new tst_QTouchEventGraphicsItem(root.data());
|
||||
tst_QTouchEventGraphicsItem *child2 = new tst_QTouchEventGraphicsItem(root.data());
|
||||
tst_QTouchEventGraphicsItem *child3 = new tst_QTouchEventGraphicsItem(root.data());
|
||||
child1->setZValue(1.);
|
||||
child2->setZValue(0.);
|
||||
child3->setZValue(-1.);
|
||||
|
|
@ -1274,7 +1261,7 @@ void tst_QTouchEvent::deleteInEventHandler()
|
|||
child2->deleteInTouchUpdate = true;
|
||||
child3->deleteInTouchEnd = true;
|
||||
|
||||
scene.addItem(root);
|
||||
scene.addItem(root.data());
|
||||
view.resize(200, 200);
|
||||
view.fitInView(scene.sceneRect());
|
||||
|
||||
|
|
@ -1302,71 +1289,75 @@ void tst_QTouchEvent::deleteInEventHandler()
|
|||
Qt::NoModifier,
|
||||
Qt::TouchPointReleased,
|
||||
touchPoints);
|
||||
bool res;
|
||||
|
||||
child1->weakpointer = &child1;
|
||||
touchBeginEvent.ignore();
|
||||
res = QApplication::sendEvent(view.viewport(), &touchBeginEvent);
|
||||
QVERIFY(res && touchBeginEvent.isAccepted() && !child1);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchBeginEvent));
|
||||
QVERIFY(touchBeginEvent.isAccepted());
|
||||
QVERIFY(!child1);
|
||||
touchUpdateEvent.ignore();
|
||||
res = QApplication::sendEvent(view.viewport(), &touchUpdateEvent);
|
||||
QVERIFY(res && touchUpdateEvent.isAccepted() && !child1);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchUpdateEvent));
|
||||
QVERIFY(!touchUpdateEvent.isAccepted()); // Qt 5.X ignores touch events.
|
||||
QVERIFY(!child1);
|
||||
touchEndEvent.ignore();
|
||||
res = QApplication::sendEvent(view.viewport(), &touchEndEvent);
|
||||
QVERIFY(res && touchUpdateEvent.isAccepted() && !child1);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchEndEvent));
|
||||
QVERIFY(!touchUpdateEvent.isAccepted());
|
||||
QVERIFY(!child1);
|
||||
|
||||
child2->weakpointer = &child2;
|
||||
touchBeginEvent.ignore();
|
||||
res = QApplication::sendEvent(view.viewport(), &touchBeginEvent);
|
||||
QVERIFY(res && touchBeginEvent.isAccepted() && child2);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchBeginEvent));
|
||||
QVERIFY(touchBeginEvent.isAccepted());
|
||||
QVERIFY(child2);
|
||||
touchUpdateEvent.ignore();
|
||||
res = QApplication::sendEvent(view.viewport(), &touchUpdateEvent);
|
||||
QVERIFY(res && !touchUpdateEvent.isAccepted() && !child2);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchUpdateEvent));
|
||||
QVERIFY(!touchUpdateEvent.isAccepted());
|
||||
QVERIFY(!child2);
|
||||
touchEndEvent.ignore();
|
||||
res = QApplication::sendEvent(view.viewport(), &touchEndEvent);
|
||||
QVERIFY(res && !touchUpdateEvent.isAccepted() && !child2);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchEndEvent));
|
||||
QVERIFY(!touchUpdateEvent.isAccepted());
|
||||
QVERIFY(!child2);
|
||||
|
||||
child3->weakpointer = &child3;
|
||||
res = QApplication::sendEvent(view.viewport(), &touchBeginEvent);
|
||||
QVERIFY(res && touchBeginEvent.isAccepted() && child3);
|
||||
res = QApplication::sendEvent(view.viewport(), &touchUpdateEvent);
|
||||
QVERIFY(res && !touchUpdateEvent.isAccepted() && child3);
|
||||
res = QApplication::sendEvent(view.viewport(), &touchEndEvent);
|
||||
QVERIFY(res && !touchEndEvent.isAccepted() && !child3);
|
||||
|
||||
delete root;
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchBeginEvent));
|
||||
QVERIFY(touchBeginEvent.isAccepted());
|
||||
QVERIFY(child3);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchUpdateEvent));
|
||||
QVERIFY(!touchUpdateEvent.isAccepted());
|
||||
QVERIFY(child3);
|
||||
QVERIFY(QApplication::sendEvent(view.viewport(), &touchEndEvent));
|
||||
QVERIFY(!touchEndEvent.isAccepted());
|
||||
QVERIFY(!child3);
|
||||
}
|
||||
}
|
||||
|
||||
void tst_QTouchEvent::deleteInRawEventTranslation()
|
||||
{
|
||||
if (qApp->platformName().toLower() == QLatin1String("wayland"))
|
||||
if (!QGuiApplication::platformName().compare(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||
QSKIP("Wayland: This fails. Figure out why.");
|
||||
|
||||
tst_QTouchEventWidget touchWidget;
|
||||
touchWidget.setWindowTitle(QTest::currentTestFunction());
|
||||
touchWidget.setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
touchWidget.setGeometry(100, 100, 300, 300);
|
||||
|
||||
tst_QTouchEventWidget *leftWidget = new tst_QTouchEventWidget;
|
||||
leftWidget->setParent(&touchWidget);
|
||||
QPointer<tst_QTouchEventWidget> leftWidget = new tst_QTouchEventWidget(&touchWidget);
|
||||
leftWidget->setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
leftWidget->setGeometry(0, 100, 100, 100);
|
||||
leftWidget->deleteInTouchBegin = true;
|
||||
leftWidget->show();
|
||||
|
||||
tst_QTouchEventWidget *centerWidget = new tst_QTouchEventWidget;
|
||||
centerWidget->setParent(&touchWidget);
|
||||
QPointer<tst_QTouchEventWidget> centerWidget = new tst_QTouchEventWidget(&touchWidget);
|
||||
centerWidget->setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
centerWidget->setGeometry(100, 100, 100, 100);
|
||||
centerWidget->deleteInTouchUpdate = true;
|
||||
centerWidget->show();
|
||||
|
||||
tst_QTouchEventWidget *rightWidget = new tst_QTouchEventWidget;
|
||||
rightWidget->setParent(&touchWidget);
|
||||
QPointer<tst_QTouchEventWidget> rightWidget = new tst_QTouchEventWidget(&touchWidget);
|
||||
rightWidget->setAttribute(Qt::WA_AcceptTouchEvents);
|
||||
rightWidget->setGeometry(200, 100, 100, 100);
|
||||
rightWidget->deleteInTouchEnd = true;
|
||||
rightWidget->show();
|
||||
|
||||
touchWidget.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&touchWidget));
|
||||
|
||||
QPointF leftPos = leftWidget->rect().center();
|
||||
QPointF centerPos = centerWidget->rect().center();
|
||||
|
|
@ -1374,9 +1365,7 @@ void tst_QTouchEvent::deleteInRawEventTranslation()
|
|||
QPointF leftScreenPos = leftWidget->mapToGlobal(leftPos.toPoint());
|
||||
QPointF centerScreenPos = centerWidget->mapToGlobal(centerPos.toPoint());
|
||||
QPointF rightScreenPos = rightWidget->mapToGlobal(rightPos.toPoint());
|
||||
QRectF screenGeometry = qApp->desktop()->screenGeometry(&touchWidget);
|
||||
|
||||
QPointer<QWidget> pl = leftWidget, pc = centerWidget, pr = rightWidget;
|
||||
QRectF screenGeometry = QApplication::desktop()->screenGeometry(&touchWidget);
|
||||
|
||||
QList<QTouchEvent::TouchPoint> rawTouchPoints;
|
||||
rawTouchPoints.append(QTouchEvent::TouchPoint(0));
|
||||
|
|
@ -1398,7 +1387,9 @@ void tst_QTouchEvent::deleteInRawEventTranslation()
|
|||
touchScreenDevice,
|
||||
touchPointList(rawTouchPoints));
|
||||
QCoreApplication::processEvents();
|
||||
QVERIFY(pl.isNull() && !pc.isNull() && !pr.isNull());
|
||||
QVERIFY(leftWidget.isNull());
|
||||
QVERIFY(!centerWidget.isNull());
|
||||
QVERIFY(!rightWidget.isNull());
|
||||
|
||||
// generate update events on all widget, the center widget should die
|
||||
rawTouchPoints[0].setState(Qt::TouchPointMoved);
|
||||
|
|
@ -1455,14 +1446,13 @@ void tst_QTouchEvent::touchBeginWithGraphicsWidget()
|
|||
{
|
||||
QGraphicsScene scene;
|
||||
QGraphicsView view(&scene);
|
||||
tst_QTouchEventGraphicsItem *root;
|
||||
root = new tst_QTouchEventGraphicsItem;
|
||||
QScopedPointer<tst_QTouchEventGraphicsItem> root(new tst_QTouchEventGraphicsItem);
|
||||
root->setAcceptTouchEvents(true);
|
||||
scene.addItem(root);
|
||||
scene.addItem(root.data());
|
||||
|
||||
QGraphicsWidget *glassWidget = new QGraphicsWidget;
|
||||
QScopedPointer<QGraphicsWidget> glassWidget(new QGraphicsWidget);
|
||||
glassWidget->setMinimumSize(100, 100);
|
||||
scene.addItem(glassWidget);
|
||||
scene.addItem(glassWidget.data());
|
||||
|
||||
view.resize(200, 200);
|
||||
view.show();
|
||||
|
|
@ -1498,17 +1488,13 @@ void tst_QTouchEvent::touchBeginWithGraphicsWidget()
|
|||
QCOMPARE(root->touchBeginCounter, 0);
|
||||
QCOMPARE(root->touchUpdateCounter, 0);
|
||||
QCOMPARE(root->touchEndCounter, 0);
|
||||
|
||||
|
||||
delete root;
|
||||
delete glassWidget;
|
||||
}
|
||||
|
||||
class WindowTouchEventFilter : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
bool eventFilter(QObject *obj, QEvent *event);
|
||||
bool eventFilter(QObject *obj, QEvent *event) Q_DECL_OVERRIDE;
|
||||
struct TouchInfo {
|
||||
QList<QTouchEvent::TouchPoint> points;
|
||||
QEvent::Type lastSeenType;
|
||||
|
|
@ -1537,18 +1523,18 @@ void tst_QTouchEvent::testQGuiAppDelivery()
|
|||
device->setType(QTouchDevice::TouchScreen);
|
||||
QWindowSystemInterface::registerTouchDevice(device);
|
||||
|
||||
QWindow *w = new QWindow;
|
||||
w->setGeometry(100, 100, 100, 100);
|
||||
w->show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(w));
|
||||
QWindow w;
|
||||
w.setGeometry(100, 100, 100, 100);
|
||||
w.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&w));
|
||||
|
||||
WindowTouchEventFilter filter;
|
||||
w->installEventFilter(&filter);
|
||||
w.installEventFilter(&filter);
|
||||
|
||||
QList<QWindowSystemInterface::TouchPoint> points;
|
||||
|
||||
// Pass empty list, should be ignored.
|
||||
QWindowSystemInterface::handleTouchEvent(w, 0, points);
|
||||
QWindowSystemInterface::handleTouchEvent(&w, 0, points);
|
||||
QCoreApplication::processEvents();
|
||||
QCOMPARE(filter.d.isEmpty(), true);
|
||||
|
||||
|
|
@ -1559,12 +1545,12 @@ void tst_QTouchEvent::testQGuiAppDelivery()
|
|||
points.append(tp);
|
||||
|
||||
// Pass 0 as device, should be ignored.
|
||||
QWindowSystemInterface::handleTouchEvent(w, 0, points);
|
||||
QWindowSystemInterface::handleTouchEvent(&w, 0, points);
|
||||
QCoreApplication::processEvents();
|
||||
QCOMPARE(filter.d.isEmpty(), true);
|
||||
|
||||
// Now the real thing.
|
||||
QWindowSystemInterface::handleTouchEvent(w, device, points); // TouchBegin
|
||||
QWindowSystemInterface::handleTouchEvent(&w, device, points); // TouchBegin
|
||||
QCoreApplication::processEvents();
|
||||
QCOMPARE(filter.d.count(), 1);
|
||||
QCOMPARE(filter.d.contains(device), true);
|
||||
|
|
@ -1572,7 +1558,7 @@ void tst_QTouchEvent::testQGuiAppDelivery()
|
|||
QCOMPARE(filter.d.value(device).lastSeenType, QEvent::TouchBegin);
|
||||
|
||||
points[0].state = Qt::TouchPointMoved;
|
||||
QWindowSystemInterface::handleTouchEvent(w, device, points); // TouchUpdate
|
||||
QWindowSystemInterface::handleTouchEvent(&w, device, points); // TouchUpdate
|
||||
QCoreApplication::processEvents();
|
||||
QCOMPARE(filter.d.count(), 1);
|
||||
QCOMPARE(filter.d.contains(device), true);
|
||||
|
|
@ -1580,7 +1566,7 @@ void tst_QTouchEvent::testQGuiAppDelivery()
|
|||
QCOMPARE(filter.d.value(device).lastSeenType, QEvent::TouchUpdate);
|
||||
|
||||
points[0].state = Qt::TouchPointReleased;
|
||||
QWindowSystemInterface::handleTouchEvent(w, device, points); // TouchEnd
|
||||
QWindowSystemInterface::handleTouchEvent(&w, device, points); // TouchEnd
|
||||
QCoreApplication::processEvents();
|
||||
QCOMPARE(filter.d.count(), 1);
|
||||
QCOMPARE(filter.d.contains(device), true);
|
||||
|
|
@ -1597,13 +1583,13 @@ void tst_QTouchEvent::testMultiDevice()
|
|||
deviceTwo->setType(QTouchDevice::TouchScreen);
|
||||
QWindowSystemInterface::registerTouchDevice(deviceTwo);
|
||||
|
||||
QWindow *w = new QWindow;
|
||||
w->setGeometry(100, 100, 100, 100);
|
||||
w->show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(w));
|
||||
QWindow w;
|
||||
w.setGeometry(100, 100, 100, 100);
|
||||
w.show();
|
||||
QVERIFY(QTest::qWaitForWindowExposed(&w));
|
||||
|
||||
WindowTouchEventFilter filter;
|
||||
w->installEventFilter(&filter);
|
||||
w.installEventFilter(&filter);
|
||||
|
||||
QList<QWindowSystemInterface::TouchPoint> pointsOne, pointsTwo;
|
||||
|
||||
|
|
@ -1620,8 +1606,8 @@ void tst_QTouchEvent::testMultiDevice()
|
|||
tp.area = QRectF(140, 140, 20, 20);
|
||||
pointsTwo.append(tp);
|
||||
|
||||
QWindowSystemInterface::handleTouchEvent(w, deviceOne, pointsOne);
|
||||
QWindowSystemInterface::handleTouchEvent(w, deviceTwo, pointsTwo);
|
||||
QWindowSystemInterface::handleTouchEvent(&w, deviceOne, pointsOne);
|
||||
QWindowSystemInterface::handleTouchEvent(&w, deviceTwo, pointsTwo);
|
||||
QCoreApplication::processEvents();
|
||||
|
||||
QCOMPARE(filter.d.contains(deviceOne), true);
|
||||
|
|
|
|||
Loading…
Reference in New Issue