Re: [Development] QTabletEvent in QML

2014-07-11 Thread Rutledge Shawn

On 11 Jul 2014, at 10:34 AM, Dean Floyd wrote:

 I have been using the Wacom Cintiq HD 24 Touch for some of my research 
 efforts, and I have tried to use MultiPointTouchArea to handle the touch 
 events, however, this has not lead to a great deal of success. To remedy the 
 situation, I decided to use the Wacom SDK to intercept these events and 
 create my own QML component to do what MultiPointTouchArea usually does, 
 which isn't awfully fast with the signal emitting and all, but sufficiently 
 smooth - I use touch events to control a camera in a 3D scene graph.

Yeah there is QTBUG-39572 for Linux, but if you are using the Wacom SDK I 
suppose you must be on Windows.  We plan to get touch working with Wacom touch 
devices.  I guess your Cintiq is different than the Bamboo relative-touch 
device (more like a touchpad) which I test with sometimes.

 Now, I would like to draw using the Wacom Pen, and, although I can do this 
 through QWidget::tabletEvent(), I was not able to find a suitable QML 
 component which offers the same tabletEvent() functionality. I see some 
 examples using MouseArea to draw with a pen, but I would like to be able to 
 distinguish between a mouse and a pen device. In other words, I would like to 
 intercept QTabletEvent events within QML. Is there a way to do this? If not, 
 could somebody confirm that this is not possible? I would highly appreciate 
 any help. Thank you.

No there is no support for QTabletEvents in QtQuick 2 yet.  I experimented with 
it during a hackathon last year; the patch which adds support for them is

https://codereview.qt-project.org/#/c/74202/

But after you've got the events in QtQuick, what next?  We are also missing 
public API for creating and manipulating polylines and ink objects.  You 
could take the events individually and then try to use Canvas in QML, or 
implement your own means of using QPainterPath in C++, or use Qt.labs.shapes 
from 

https://codereview.qt-project.org/#/admin/projects/playground/scenegraph

I tried to use the latter approach.  It depends whether you want to create 
vector shapes that can be manipulated later, in small quantities and 
unfortunately without antialiasing; or to have an art-oriented painting 
program, in which case you might want to try Krita.  It will be ported to Qt 5 
eventually.  But I'm thinking more about vector drawing...

We don't have polylines (sequences of lines, arcs, Bezier curves etc.) in Qt 
Quick because we need to figure out how to render them antialiased (maybe even 
without relying on MSAA) and also animatable.  But what would the code look 
like to apply an animation to one of the control points within a polyline?  You 
wouldn't want every point to be a QObject just to be able to make the 
occasional binding; and usually the points would come from non-QML data sources 
like sequences of tablet events, or SVG paths.  A JS API for appending points 
to a path is not enough.

An even stickier problem is how to serialize the Item graph in memory (after 
you have drawn some new shapes with your tablet) into a QML file.  I tried and 
got a hacky incomplete solution working, but it became evident that QML just 
isn't designed for that.  So if you want to create a vector drawing program in 
the short term, you need to create your own C++ model anyway.  So then you 
might as well handle the tablet events in C++ too.  To integrate with Qt Quick 
you could wrap the whole drawing renderer into a QQuickItem subclass which 
implements its own updatePaintNode() to render the vector shapes, or have one 
of those per shape.

So there are several problems left to solve, and then maybe there's a chance 
Qt.labs.shapes could be converted into something worth shipping with Qt. Maybe 
we could even build a complete framework for vector drawing applications.  I 
would like to, because as was just discussed in another thread, GraphicsView is 
at this point the easier solution to code up this type of use case, but it's 
older and isn't really the way forward for the future.

___
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development


Re: [Development] QTabletEvent in QML

2014-07-11 Thread Dean Floyd
On Fri, Jul 11, 2014 at 11:58 AM, Rutledge Shawn shawn.rutle...@digia.com
wrote:


 On 11 Jul 2014, at 10:34 AM, Dean Floyd wrote:

  I have been using the Wacom Cintiq HD 24 Touch for some of my research
 efforts, and I have tried to use MultiPointTouchArea to handle the touch
 events, however, this has not lead to a great deal of success. To remedy
 the situation, I decided to use the Wacom SDK to intercept these events and
 create my own QML component to do what MultiPointTouchArea usually does,
 which isn't awfully fast with the signal emitting and all, but sufficiently
 smooth - I use touch events to control a camera in a 3D scene graph.

 Yeah there is QTBUG-39572 for Linux, but if you are using the Wacom SDK I
 suppose you must be on Windows.  We plan to get touch working with Wacom
 touch devices.  I guess your Cintiq is different than the Bamboo
 relative-touch device (more like a touchpad) which I test with sometimes.


I'm actually on a Macintosh, and some of the boys here are on Windows. By
Wacom SDK, I meant the Feel Multi Touch API. MultiPointTouchArea receives
touch events generated by the Magic TrackPad on iMac, but not from Cintiq.
Do you think this is still related to QTBUG-39572?

  Now, I would like to draw using the Wacom Pen, and, although I can do
 this through QWidget::tabletEvent(), I was not able to find a suitable QML
 component which offers the same tabletEvent() functionality. I see some
 examples using MouseArea to draw with a pen, but I would like to be able to
 distinguish between a mouse and a pen device. In other words, I would like
 to intercept QTabletEvent events within QML. Is there a way to do this? If
 not, could somebody confirm that this is not possible? I would highly
 appreciate any help. Thank you.

 No there is no support for QTabletEvents in QtQuick 2 yet.  I experimented
 with it during a hackathon last year; the patch which adds support for them
 is

 https://codereview.qt-project.org/#/c/74202/


Splendid! I will surely take a look at it. If I manage to further your
efforts on this account, I will most certainly send you patches.


 But after you've got the events in QtQuick, what next?  We are also
 missing public API for creating and manipulating polylines and ink
 objects.  You could take the events individually and then try to use Canvas
 in QML, or implement your own means of using QPainterPath in C++, or use
 Qt.labs.shapes from

 https://codereview.qt-project.org/#/admin/projects/playground/scenegraph


I only need the x, y, pressure, and tilt information from the pen. Then I
intend to go back to C++, and use our own rendering libraries. There are
various reasons why we must use QtQuick, in lieu of QtWidgets. Now I gather
this is not possible with QtQuick. Thanks for confirming this.

I looked at Krita, and it appears they are using Wintab for Windows, and
the linux-related drivers and libraries for Linux to intercept pen events.
I did not find anything suitable for Macintosh there. Does Krita handle pen
events in Macintosh? Alternatively, I could use the Cocoa framework to
handle the pen events, but I do not wish to enter a world of pain by trying
to mix QtQuick and Cocoa. Ideally, we would like to have a QML component
that intercepts tabletEvents() akin to QtWidgets.

Thank you for your elaborate answer, and help!

Dean Floyd

EPFL
___
Development mailing list
Development@qt-project.org
http://lists.qt-project.org/mailman/listinfo/development