QTabletEvent manual test: show buttons, pressure, eraser

- Show which button was pressed or released
- Render an ellipse proportional to pressure for each point drawn
- Different color for the eraser
- More complete output for each event
- Don't show mouse events by default, just as most tablet applications
  can now ignore mouse events on the drawing canvas.  But for the
  purpose of testing interleaving of tablet and mouse events,
  one can give the argument --mouse when starting this program
  to show them too, as before.

Task-number: QTBUG-39458
Change-Id: I5e03f1aa748be39d524bd6984ff5d66579787cf9
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
This commit is contained in:
Shawn Rutledge 2014-06-06 09:43:00 +02:00
parent 6c1a12c558
commit da9e02eb83
4 changed files with 127 additions and 39 deletions

View File

@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the test suite of the Qt Toolkit.
@ -40,11 +40,21 @@
****************************************************************************/
#include <QApplication>
#include <QDebug>
#include "tabletwidget.h"
int main(int argc, char **argv) {
QApplication app(argc, argv);
TabletWidget tabletWidget;
tabletWidget.showMaximized();
return app.exec();
QApplication app(argc, argv);
bool mouseToo = false;
if (app.arguments().contains(QLatin1String("--nomouse")) || app.arguments().contains(QLatin1String("-nomouse")))
mouseToo = false;
else if (app.arguments().contains(QLatin1String("--mouse")) || app.arguments().contains(QLatin1String("-mouse")))
mouseToo = true;
if (mouseToo)
qDebug() << "will show mouse events coming from the tablet as well as QTabletEvents";
else
qDebug() << "will not show mouse events from the tablet; use the --mouse option to enable";
TabletWidget tabletWidget(mouseToo);
tabletWidget.showMaximized();
return app.exec();
}

View File

@ -42,8 +42,11 @@
#include "tabletwidget.h"
#include <QPainter>
#include <QApplication>
#include <QDebug>
#include <QMetaObject>
#include <QMetaEnum>
TabletWidget::TabletWidget()
TabletWidget::TabletWidget(bool mouseToo) : mMouseToo(mouseToo)
{
QPalette newPalette = palette();
newPalette.setColor(QPalette::Window, Qt::white);
@ -76,12 +79,14 @@ bool TabletWidget::eventFilter(QObject *, QEvent *ev)
mPress = event->pressure();
mTangential = event->tangentialPressure();
mRot = event->rotation();
mButton = event->button();
mButtons = event->buttons();
if (isVisible())
update();
break;
}
case QEvent::MouseMove:
{
if (mMouseToo) {
resetAttributes();
QMouseEvent *event = static_cast<QMouseEvent*>(ev);
mType = event->type();
@ -129,7 +134,7 @@ void TabletWidget::paintEvent(QPaintEvent *)
|| mType == QEvent::TabletMove || mType == QEvent::TabletPress
|| mType == QEvent::TabletRelease) {
eventInfo << QString("Hight res global position: %1 %2").arg(QString::number(mHiResGlobalPos.x()), QString::number(mHiResGlobalPos.y()));
eventInfo << QString("High res global position: %1 %2").arg(QString::number(mHiResGlobalPos.x()), QString::number(mHiResGlobalPos.y()));
QString pointerType("Pointer type: ");
switch (mPointerType) {
@ -148,7 +153,6 @@ void TabletWidget::paintEvent(QPaintEvent *)
}
eventInfo << pointerType;
QString deviceString = "Device type: ";
switch (mDev) {
case QTabletEvent::NoDevice:
@ -172,6 +176,8 @@ void TabletWidget::paintEvent(QPaintEvent *)
}
eventInfo << deviceString;
eventInfo << QString("Button: %1 (0x%2)").arg(buttonToString(mButton)).arg(mButton, 0, 16);
eventInfo << QString("Buttons currently pressed: %1 (0x%2)").arg(buttonsToString(mButtons)).arg(mButtons, 0, 16);
eventInfo << QString("Pressure: %1").arg(QString::number(mPress));
eventInfo << QString("Tangential pressure: %1").arg(QString::number(mTangential));
eventInfo << QString("Rotation: %1").arg(QString::number(mRot));
@ -182,7 +188,25 @@ void TabletWidget::paintEvent(QPaintEvent *)
eventInfo << QString("Unique Id: %1").arg(QString::number(mUnique));
}
painter.drawText(rect(), eventInfo.join("\n"));
QString text = eventInfo.join("\n");
painter.drawText(rect(), text);
}
const char *TabletWidget::buttonToString(Qt::MouseButton b)
{
static int enumIdx = QObject::staticQtMetaObject.indexOfEnumerator("MouseButtons");
return QObject::staticQtMetaObject.enumerator(enumIdx).valueToKey(b);
}
QString TabletWidget::buttonsToString(Qt::MouseButtons bs)
{
QStringList ret;
for (int i = 0; (uint)(1 << i) <= Qt::MaxMouseButton; ++i) {
Qt::MouseButton b = static_cast<Qt::MouseButton>(1 << i);
if (bs.testFlag(b))
ret << buttonToString(b);
}
return ret.join("|");
}
void TabletWidget::tabletEvent(QTabletEvent *event)

View File

@ -49,11 +49,13 @@
class TabletWidget : public QWidget
{
public:
TabletWidget();
TabletWidget(bool mouseToo);
protected:
bool eventFilter(QObject *obj, QEvent *ev);
void tabletEvent(QTabletEvent *event);
void paintEvent(QPaintEvent *event);
const char *buttonToString(Qt::MouseButton b);
QString buttonsToString(Qt::MouseButtons bs);
private:
void resetAttributes() {
mType = mDev = mPointerType = mXT = mYT = mZ = 0;
@ -66,8 +68,11 @@ private:
QPoint mPos, mGPos;
QPointF mHiResGlobalPos;
int mDev, mPointerType, mXT, mYT, mZ;
Qt::MouseButton mButton;
Qt::MouseButtons mButtons;
qreal mPress, mTangential, mRot;
qint64 mUnique;
bool mMouseToo;
};
#endif // TABLETWIDGET_H

View File

@ -54,16 +54,20 @@
enum TabletPointType {
TabletButtonPress,
TabletButtonRelease,
TabletMove,
TabletDraw
TabletMove
};
struct TabletPoint
{
TabletPoint(const QPoint &p = QPoint(), TabletPointType t = TabletMove) : pos(p), type(t) {}
TabletPoint(const QPointF &p = QPointF(), TabletPointType t = TabletMove,
Qt::MouseButton b = Qt::LeftButton, QTabletEvent::PointerType pt = QTabletEvent::UnknownPointer, qreal prs = 0) :
pos(p), type(t), button(b), ptype(pt), pressure(prs) {}
QPoint pos;
QPointF pos;
TabletPointType type;
Qt::MouseButton button;
QTabletEvent::PointerType ptype;
qreal pressure;
};
class EventReportWidget : public QWidget
@ -90,36 +94,47 @@ private:
bool m_lastIsMouseMove;
bool m_lastIsTabletMove;
Qt::MouseButton m_lastButton;
QVector<TabletPoint> m_points;
};
EventReportWidget::EventReportWidget()
: m_lastIsMouseMove(false)
, m_lastIsTabletMove(false)
, m_lastButton(Qt::NoButton)
{ }
void EventReportWidget::paintEvent(QPaintEvent *)
{
QPainter p(this);
const QRect geom = QRect(QPoint(0, 0), size());
const QRectF geom = QRectF(QPoint(0, 0), size());
p.fillRect(geom, Qt::white);
p.drawRect(QRect(geom.topLeft(), geom.bottomRight() - QPoint(1,1)));
p.drawRect(QRectF(geom.topLeft(), geom.bottomRight() - QPointF(1,1)));
p.setPen(Qt::white);
foreach (const TabletPoint &t, m_points) {
if (geom.contains(t.pos)) {
QPainterPath pp;
pp.addEllipse(t.pos, 5, 5);
pp.addEllipse(t.pos, 8, 8);
QRectF pointBounds(t.pos.x() - 10, t.pos.y() - 10, 20, 20);
switch (t.type) {
case TabletButtonPress:
p.fillPath(pp, Qt::black);
p.fillPath(pp, Qt::darkGreen);
if (t.button != Qt::NoButton)
p.drawText(pointBounds, Qt::AlignCenter, QString::number(t.button));
break;
case TabletButtonRelease:
p.fillPath(pp, Qt::red);
if (t.button != Qt::NoButton)
p.drawText(pointBounds, Qt::AlignCenter, QString::number(t.button));
break;
case TabletMove:
p.drawPath(pp);
break;
case TabletDraw:
p.fillPath(pp, Qt::blue);
if (t.pressure > 0.0) {
p.setPen(t.ptype == QTabletEvent::Eraser ? Qt::red : Qt::black);
p.drawEllipse(t.pos, t.pressure * 10.0, t.pressure * 10.0);
p.setPen(Qt::white);
} else {
p.fillRect(t.pos.x() - 2, t.pos.y() - 2, 4, 4, Qt::black);
}
break;
}
}
@ -128,37 +143,30 @@ void EventReportWidget::paintEvent(QPaintEvent *)
void EventReportWidget::tabletEvent(QTabletEvent *event)
{
QWidget::tabletEvent(event);
QWidget::tabletEvent(event);
QString type;
switch (event->type()) {
case QEvent::TabletEnterProximity:
m_lastIsTabletMove = false;
type = QString::fromLatin1("TabletEnterProximity");
break;
case QEvent::TabletLeaveProximity:
m_lastIsTabletMove = false;
type = QString::fromLatin1("TabletLeaveProximity");
break;
case QEvent::TabletMove:
if (m_lastIsTabletMove)
return;
m_lastIsTabletMove = true;
type = QString::fromLatin1("TabletMove");
m_points.push_back(TabletPoint(event->pos(), event->pressure() ? TabletDraw : TabletMove));
m_points.push_back(TabletPoint(event->pos(), TabletMove, m_lastButton, event->pointerType(), event->pressure()));
update();
break;
case QEvent::TabletPress:
m_lastIsTabletMove = false;
type = QString::fromLatin1("TabletPress");
m_points.push_back(TabletPoint(event->pos(), TabletButtonPress));
m_points.push_back(TabletPoint(event->pos(), TabletButtonPress, event->button(), event->pointerType()));
m_lastButton = event->button();
update();
break;
case QEvent::TabletRelease:
m_lastIsTabletMove = false;
type = QString::fromLatin1("TabletRelease");
m_points.push_back(TabletPoint(event->pos(), TabletButtonRelease));
m_points.push_back(TabletPoint(event->pos(), TabletButtonRelease, event->button(), event->pointerType()));
update();
break;
default:
@ -166,10 +174,51 @@ void EventReportWidget::tabletEvent(QTabletEvent *event)
break;
}
qDebug() << "Tablet event, type = " << type
<< " position = " << event->pos()
<< " global position = " << event->globalPos()
<< " cursor at " << QCursor::pos();
QString pointerType = "UNKNOWN";
switch (event->pointerType()) {
case QTabletEvent::Pen:
pointerType = "Pen";
break;
case QTabletEvent::Cursor:
pointerType = "Cursor";
break;
case QTabletEvent::Eraser:
pointerType = "Eraser";
break;
default:
break;
}
QString device = "UNKNOWN";
switch (event->device()) {
case QTabletEvent::Puck:
pointerType = "Puck";
break;
case QTabletEvent::Stylus:
pointerType = "Stylus";
break;
case QTabletEvent::Airbrush:
pointerType = "Airbrush";
break;
case QTabletEvent::FourDMouse:
pointerType = "FourDMouse";
break;
case QTabletEvent::RotationStylus:
pointerType = "RotationStylus";
break;
default:
break;
}
if (!m_lastIsTabletMove)
qDebug() << "Tablet event, type = " << type
<< " position = " << event->pos()
<< " global position = " << event->globalPos()
<< " cursor at " << QCursor::pos()
<< " buttons " << event->buttons() << " changed " << event->button()
<< " pointer type " << pointerType << " device " << device;
m_lastIsTabletMove = (event->type() == QEvent::TabletMove);
}
void EventReportWidget::outputMouseEvent(QMouseEvent *event)