summaryrefslogtreecommitdiffstats
path: root/doc/src/examples/tablet.qdoc
diff options
context:
space:
mode:
Diffstat (limited to 'doc/src/examples/tablet.qdoc')
-rw-r--r--doc/src/examples/tablet.qdoc369
1 files changed, 0 insertions, 369 deletions
diff --git a/doc/src/examples/tablet.qdoc b/doc/src/examples/tablet.qdoc
deleted file mode 100644
index 57fa7d5eca..0000000000
--- a/doc/src/examples/tablet.qdoc
+++ /dev/null
@@ -1,369 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** GNU Free Documentation License
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms
-** and conditions contained in a signed written agreement between you
-** and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example widgets/tablet
- \title Tablet Example
-
- This example shows how to use a Wacom tablet in Qt applications.
-
- \image tabletexample.png
-
- When you use a tablet with Qt applications, \l{QTabletEvent}s are
- generated. You need to reimplement the
- \l{QWidget::}{tabletEvent()} event handler if you want to handle
- tablet events. Events are generated when the device used for
- drawing enters and leaves the proximity of the tablet (i.e., when
- it is close but not pressed down on it), when a device is pushed
- down and released from it, and when a device is moved on the
- tablet.
-
- The information available in QTabletEvent depends on the device
- used. The tablet in this example has two different devices for
- drawing: a stylus and an airbrush. For both devices the event
- contains the position of the device, pressure on the tablet,
- vertical tilt, and horizontal tilt (i.e, the angle between the
- device and the perpendicular of the tablet). The airbrush has a
- finger wheel; the position of this is also available in the tablet
- event.
-
- In this example we implement a drawing program. You can use the
- stylus to draw on the tablet as you use a pencil on paper. When
- you draw with the airbrush you get a spray of paint; the finger
- wheel is used to change the density of the spray. The pressure and
- tilt can change the alpha and saturation values of the QColor and the
- width of the QPen used for drawing.
-
- The example consists of the following:
-
- \list
- \li The \c MainWindow class inherits QMainWindow and creates
- the examples menus and connect their slots and signals.
- \li The \c TabletCanvas class inherits QWidget and
- receives tablet events. It uses the events to paint on a
- offscreen pixmap, which it draws onto itself.
- \li The \c TabletApplication class inherits QApplication. This
- class handles tablet events that are not sent to \c tabletEvent().
- We will look at this later.
- \li The \c main() function creates a \c MainWindow and shows it
- as a top level window.
- \endlist
-
-
- \section1 MainWindow Class Definition
-
- The \c MainWindow creates a \c TabletCanvas and sets it as its
- center widget.
-
- \snippet examples/widgets/tablet/mainwindow.h 0
-
- The QActions let the user select if the tablets pressure and
- tilt should change the pen width, color alpha component and color
- saturation. \c createActions() creates all actions, and \c
- createMenus() sets up the menus with the actions. We have one
- QActionGroup for the actions that alter the alpha channel, color
- saturation and line width respectively. The action groups are
- connected to the \c alphaActionTriggered(), \c
- colorSaturationActiontriggered(), and \c
- lineWidthActionTriggered() slots, which calls functions in \c
- myCanvas.
-
-
- \section1 MainWindow Class Implementation
-
- We start width a look at the constructor \c MainWindow():
-
- \snippet examples/widgets/tablet/mainwindow.cpp 0
-
- In the constructor we create the canvas, actions, and menus.
- We set the canvas as the center widget. We also initialize the
- canvas to match the state of our menus and start drawing with a
- red color.
-
- Here is the implementation of \c brushColorAct():
-
- \snippet examples/widgets/tablet/mainwindow.cpp 1
-
- We let the user pick a color with a QColorDialog. If it is valid,
- we set a new drawing color with \c setColor().
-
- Here is the implementation of \c alphaActionTriggered():
-
- \snippet examples/widgets/tablet/mainwindow.cpp 2
-
- The \c TabletCanvas class supports two ways by which the alpha
- channel of the drawing color can be changed: tablet pressure and
- tilt. We have one action for each and an action if the alpha
- channel should not be changed.
-
- Here is the implementation of \c lineWidthActionTriggered():
-
- \snippet examples/widgets/tablet/mainwindow.cpp 3
-
- We check which action is selected in \c lineWidthGroup, and set
- how the canvas should change the drawing line width.
-
- Here is the implementation of \c saturationActionTriggered():
-
- \snippet examples/widgets/tablet/mainwindow.cpp 4
-
- We check which action is selected in \c colorSaturationGroup, and
- set how the canvas should change the color saturation of the
- drawing color.
-
- Here is the implementation of \c saveAct():
-
- \snippet examples/widgets/tablet/mainwindow.cpp 5
-
- We use the QFileDialog to let the user select a file to save the
- drawing in. It is the \c TabletCanvas that save the drawing, so we
- call its \c saveImage() function.
-
- Here is the implementation of \c loadAct():
-
- \snippet examples/widgets/tablet/mainwindow.cpp 6
-
- We let the user select the image file to be opened with
- a QFileDialog; we then ask the canvas to load the image with \c
- loadImage().
-
- Here is the implementation of \c aboutAct():
-
- \snippet examples/widgets/tablet/mainwindow.cpp 7
-
- We show a message box with a short description of the example.
-
- \c createActions() creates all actions and action groups of
- the example. We look at the creation of one action group and its
- actions. See the \l{Application Example}{application example} if
- you want a high-level introduction to QActions.
-
- Here is the implementation of \c createActions:
-
- \snippet examples/widgets/tablet/mainwindow.cpp 8
- \dots
- \snippet examples/widgets/tablet/mainwindow.cpp 9
-
- We want the user to be able to choose if the drawing color's
- alpha component should be changed by the tablet pressure or tilt.
- We have one action for each choice and an action if the alpha
- channel is not to be changed, i.e, the color is opaque. We make
- the actions checkable; the \c alphaChannelGroup will then ensure
- that only one of the actions are checked at any time. The \c
- triggered() signal is emitted when an action is checked.
-
- \dots
- \snippet examples/widgets/tablet/mainwindow.cpp 10
-
- Here is the implementation of \c createMenus():
-
- \snippet examples/widgets/tablet/mainwindow.cpp 11
-
- We create the menus of the example and add the actions to them.
-
-
- \section1 TabletCanvas Class Definition
-
- The \c TabletCanvas class provides a surface on which the
- user can draw with a tablet.
-
- \snippet examples/widgets/tablet/tabletcanvas.h 0
-
- The canvas can change the alpha channel, color saturation,
- and line width of the drawing. We have one enum for each of
- these; their values decide if it is the tablet pressure or tilt
- that will alter them. We keep a private variable for each, the \c
- alphaChannelType, \c colorSturationType, and \c penWidthType,
- which we provide access functions for.
-
- We draw on a QPixmap with \c myPen and \c myBrush using \c
- myColor. The \c saveImage() and \c loadImage() saves and loads
- the QPixmap to disk. The pixmap is drawn on the widget in \c
- paintEvent(). The \c pointerType and \c deviceType keeps the type
- of pointer, which is either a pen or an eraser, and device
- currently used on the tablet, which is either a stylus or an
- airbrush.
-
- The interpretation of events from the tablet is done in \c
- tabletEvent(); \c paintPixmap(), \c updateBrush(), and \c
- brushPattern() are helper functions used by \c tabletEvent().
-
-
- \section1 TabletCanvas Class Implementation
-
- We start with a look at the constructor:
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 0
-
- In the constructor we initialize our class variables. We need
- to draw the background of our pixmap, as the default is gray.
-
- Here is the implementation of \c saveImage():
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 1
-
- QPixmap implements functionality to save itself to disk, so we
- simply call \l{QPixmap::}{save()}.
-
- Here is the implementation of \c loadImage():
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 2
-
- We simply call \l{QPixmap::}{load()}, which loads the image in \a
- file.
-
- Here is the implementation of \c tabletEvent():
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 3
-
- We get three kind of events to this function: TabletPress,
- TabletRelease, and TabletMove, which is generated when a device
- is pressed down on, leaves, or moves on the tablet. We set the \c
- deviceDown to true when a device is pressed down on the tablet;
- we then know when we should draw when we receive move events. We
- have implemented the \c updateBrush() and \c paintPixmap() helper
- functions to update \c myBrush and \c myPen after the state of \c
- alphaChannelType, \c colorSaturationType, and \c lineWidthType.
-
- Here is the implementation of \c paintEvent():
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 4
-
- We simply draw the pixmap to the top left of the widget.
-
- Here is the implementation of \c paintPixmap():
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 5
-
- In this function we draw on the pixmap based on the movement of the
- device. If the device used on the tablet is a stylus we want to draw a
- line between the positions of the stylus recorded in \c polyLine. We
- also assume that this is a reasonable handling of any unknown device,
- but update the statusbar with a warning so that the user can see that
- for his tablet he might have to implement special handling.
- If it is an airbrush we want to draw a circle of points with a
- point density based on the tangential pressure, which is the position
- of the finger wheel on the airbrush. We use the Qt::BrushStyle to
- draw the points as it has styles that draw points with different
- density; we select the style based on the tangential pressure in
- \c brushPattern().
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 6
-
- We return a brush style with a point density that increases with
- the tangential pressure.
-
- In \c updateBrush() we set the pen and brush used for drawing
- to match \c alphaChannelType, \c lineWidthType, \c
- colorSaturationType, and \c myColor. We will examine the code to
- set up \c myBrush and \c myPen for each of these variables:
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 7
-
- We fetch the current drawingcolor's hue, saturation, value,
- and alpha values. \c hValue and \c vValue are set to the
- horizontal and vertical tilt as a number from 0 to 255. The
- original values are in degrees from -60 to 60, i.e., 0 equals
- -60, 127 equals 0, and 255 equals 60 degrees. The angle measured
- is between the device and the perpendicular of the tablet (see
- QTabletEvent for an illustration).
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 8
-
- The alpha channel of QColor is given as a number between 0
- and 255 where 0 is transparent and 255 is opaque.
- \l{QTabletEvent::}{pressure()} returns the pressure as a qreal
- between 0.0 and 1.0. By subtracting 127 from the tilt values and
- taking the absolute value we get the smallest alpha values (i.e.,
- the color is most transparent) when the pen is perpendicular to
- the tablet. We select the largest of the vertical and horizontal
- tilt value.
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 9
-
- The colorsaturation is given as a number between 0 and 255. It is
- set with \l{QColor::}{setHsv()}. We can set the tilt values
- directly, but must multiply the pressure to a number between 0 and
- 255.
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 10
-
- The width of the pen increases with the pressure. When the pen
- width is controlled with the tilt we let the width increse with
- the angle between the device and the perpendicular of the tablet.
-
- \snippet examples/widgets/tablet/tabletcanvas.cpp 11
-
- We finally check whether the pointer is the stylus or the eraser.
- If it is the eraser, we set the color to the background color of
- the pixmap an let the pressure decide the pen width, else we set
- the colors we have set up previously in the function.
-
-
- \section1 TabletApplication Class Definition
-
- We inherit QApplication in this class because we want to
- reimplement the \l{QApplication::}{event()} function.
-
- \snippet examples/widgets/tablet/tabletapplication.h 0
-
- We keep a \c TabletCanvas we send the device type of the events we
- handle in the \c event() function to. The TabletEnterProximity
- and TabletLeaveProximity events are not sendt to the QApplication
- object, while other tablet events are sendt to the QWidget's
- \c event(), which sends them on to \l{QWidget::}{tabletEvent()}.
- Since we want to handle these events we have implemented \c
- TabletApplication.
-
-
- \section1 TabletApplication Class Implementation
-
- Here is the implementation of \c event():
-
- \snippet examples/widgets/tablet/tabletapplication.cpp 0
-
- We use this function to handle the TabletEnterProximity and
- TabletLeaveProximity events, which is generated when a device
- enters and leaves the proximity of the tablet. The intended use of these
- events is to do work that is dependent on what kind of device is
- used on the tablet. This way, you don't have to do this work
- when other events are generated, which is more frequently than the
- leave and enter proximity events. We call \c setTabletDevice() in
- \c TabletCanvas.
-
- \section1 The \c main() function
-
- Here is the examples \c main() function:
-
- \snippet examples/widgets/tablet/main.cpp 0
-
- In the \c main() function we create a \c MainWinow and display it
- as a top level window. We use the \c TabletApplication class. We
- need to set the canvas after the application is created. We cannot
- use classes that implement event handling before an QApplication
- object is instantiated.
-*/