summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2012-09-06 13:51:02 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-09-22 20:46:30 +0200
commitf6155aec30c343edbad5ba12b189ca2d9c4904b5 (patch)
tree38d65fd1ce30e02d8012037ecb867064296a93fa /tests
parente0b1eac3ff1abbf4f8d27d6b0bdfe0ebc1d12b7c (diff)
Redirect keyboard/mouse grab to the widget parent window.
Use the native parent's window if the widget in question does not have one. This should be in line with Qt 4.8 using effectiveWinId(). Remove redundant code in grabMouse(QCursor). Change-Id: Id6ab192e739221fe89f865f4d2f7a6d4671a190b Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@digia.com> Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index 322f978e84..c457d601f3 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -383,6 +383,7 @@ private slots:
void nativeChildFocus();
void grab();
+ void grabMouse();
void touchEventSynthesizedMouseEvent();
@@ -9333,6 +9334,75 @@ void tst_QWidget::grab()
}
}
+/* grabMouse() tests whether mouse grab for a widget without window handle works.
+ * It creates a top level widget with another nested widget inside. The inner widget grabs
+ * the mouse and a series of mouse presses moving over the top level's window is simulated.
+ * Only the inner widget should receive events. */
+
+static inline QString mouseEventLogEntry(const QString &objectName, QEvent::Type t, const QPoint &p, Qt::MouseButtons b)
+{
+ QString result;
+ QDebug(&result).nospace() << objectName << " Mouse event " << t << " at " << p << " buttons " << b;
+ return result;
+}
+
+class GrabLoggerWidget : public QWidget {
+public:
+ explicit GrabLoggerWidget(QStringList *log, QWidget *parent = 0) : QWidget(parent), m_log(log) {}
+
+protected:
+ bool event(QEvent *e)
+ {
+ switch (e->type()) {
+ case QEvent::MouseButtonPress:
+ case QEvent::MouseMove:
+ case QEvent::MouseButtonRelease: {
+ QMouseEvent *me = static_cast<QMouseEvent *>(e);
+ m_log->push_back(mouseEventLogEntry(objectName(), me->type(), me->pos(), me->buttons()));
+ me->accept();
+ return true;
+ }
+ default:
+ break;
+ }
+ return QWidget::event(e);
+ }
+private:
+ QStringList *m_log;
+};
+
+void tst_QWidget::grabMouse()
+{
+ QStringList log;
+ GrabLoggerWidget w(&log);
+ w.setObjectName(QLatin1String("tst_qwidget_grabMouse"));
+ w.setWindowTitle(w.objectName());
+ QLayout *layout = new QVBoxLayout(&w);
+ layout->setMargin(50);
+ GrabLoggerWidget *grabber = new GrabLoggerWidget(&log, &w);
+ const QString grabberObjectName = QLatin1String("tst_qwidget_grabMouse_grabber");
+ grabber->setObjectName(grabberObjectName);
+ grabber->setMinimumSize(100, 100);
+ layout->addWidget(grabber);
+ w.show();
+ qApp->setActiveWindow(&w);
+ QVERIFY(QTest::qWaitForWindowActive(&w));
+
+ QStringList expectedLog;
+ grabber->grabMouse();
+ QPoint mousePos = QPoint(w.width() / 2, 10);
+ const int step = w.height() / 5;
+ for ( ; mousePos.y() < w.height() ; mousePos.ry() += step) {
+ QTest::mouseClick(w.windowHandle(), Qt::LeftButton, 0, mousePos);
+ // Events should go to the grabber child using its coordinates.
+ const QPoint expectedPos = grabber->mapFromParent(mousePos);
+ expectedLog.push_back(mouseEventLogEntry(grabberObjectName, QEvent::MouseButtonPress, expectedPos, Qt::LeftButton));
+ expectedLog.push_back(mouseEventLogEntry(grabberObjectName, QEvent::MouseButtonRelease, expectedPos, Qt::NoButton));
+ }
+ grabber->releaseMouse();
+ QCOMPARE(log, expectedLog);
+}
+
class TouchMouseWidget : public QWidget {
public:
explicit TouchMouseWidget(QWidget *parent = 0)