static void mouseEvent(MouseAction action, QWidget *widget, QObject *item, Qt::MouseButton button, Qt::KeyboardModifiers stateKey, QPointF _pos, int delay=-1) { QTEST_ASSERT(widget); QTEST_ASSERT(item); if (delay == -1 || delay < QTest::defaultMouseDelay()) delay = QTest::defaultMouseDelay(); if (delay > 0) QTest::qWait(delay); if (action == MouseClick) { mouseEvent(MousePress, widget, item, button, stateKey, _pos); mouseEvent(MouseRelease, widget, item, button, stateKey, _pos); return; } QPoint pos; QDeclarativeView *view = qobject_cast<QDeclarativeView *>(widget); QWidget *eventWidget = widget; QDeclarativeItem *ditem = qobject_cast<QDeclarativeItem *>(item); if (!ditem) { qWarning("Mouse event target is not an Item"); return; } pos = view->mapFromScene(ditem->mapToScene(_pos)); eventWidget = view->viewport(); QTEST_ASSERT(button == Qt::NoButton || button & Qt::MouseButtonMask); QTEST_ASSERT(stateKey == 0 || stateKey & Qt::KeyboardModifierMask); stateKey &= static_cast<unsigned int>(Qt::KeyboardModifierMask); QMouseEvent me(QEvent::User, QPoint(), Qt::LeftButton, button, stateKey); switch (action) { case MousePress: me = QMouseEvent(QEvent::MouseButtonPress, pos, widget->mapToGlobal(pos), button, button, stateKey); break; case MouseRelease: me = QMouseEvent(QEvent::MouseButtonRelease, pos, widget->mapToGlobal(pos), button, 0, stateKey); break; case MouseDoubleClick: me = QMouseEvent(QEvent::MouseButtonDblClick, pos, widget->mapToGlobal(pos), button, button, stateKey); break; case MouseMove: if (button == Qt::NoButton) { // If we send a mouse move event with no button pressed, it will be // rejected (unless mouseTracking is set to true); simulate instead QCursor::setPos(widget->mapToGlobal(pos)); qApp->processEvents(); } else { me = QMouseEvent(QEvent::MouseMove, pos, widget->mapToGlobal(pos), button, button, stateKey); } break; default: QTEST_ASSERT(false); } QSpontaneKeyEvent::setSpontaneous(&me); if (!qApp->notify(eventWidget, &me)) { static const char *mouseActionNames[] = { "MousePress", "MouseRelease", "MouseClick", "MouseDoubleClick", "MouseMove" }; QString warning = QString::fromLatin1("Mouse event \"%1\" not accepted by receiving widget"); QTest::qWarn(warning.arg(QString::fromLatin1(mouseActionNames[static_cast<int>(action)])).toAscii().data()); } }