summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/widgets/desktop/systray/doc/src/systray.qdoc13
-rw-r--r--examples/widgets/doc/src/fridgemagnets.qdoc2
-rw-r--r--examples/widgets/doc/src/systray.qdoc179
-rw-r--r--examples/widgets/doc/src/tablet.qdoc339
-rw-r--r--examples/widgets/tools/codecs/doc/src/codecs.qdoc1
-rw-r--r--examples/widgets/widgets/tablet/mainwindow.cpp229
-rw-r--r--examples/widgets/widgets/tablet/mainwindow.h58
-rw-r--r--examples/widgets/widgets/tablet/tabletapplication.cpp2
-rw-r--r--examples/widgets/widgets/tablet/tabletapplication.h4
-rw-r--r--examples/widgets/widgets/tablet/tabletcanvas.cpp113
-rw-r--r--examples/widgets/widgets/tablet/tabletcanvas.h46
-rw-r--r--examples/xml/dombookmarks/doc/src/dombookmarks.qdoc1
-rw-r--r--examples/xml/xmlstreamlint/doc/src/xmlstreamlint.qdoc2
13 files changed, 351 insertions, 638 deletions
diff --git a/examples/widgets/desktop/systray/doc/src/systray.qdoc b/examples/widgets/desktop/systray/doc/src/systray.qdoc
index fa2dbb2721..ae6df351bb 100644
--- a/examples/widgets/desktop/systray/doc/src/systray.qdoc
+++ b/examples/widgets/desktop/systray/doc/src/systray.qdoc
@@ -28,9 +28,8 @@
/*!
\example desktop/systray
\title System Tray Icon Example
-
-
- The System Tray Icon example shows how to add an icon with a menu
+ \ingroup examples-widgets
+ \brief The System Tray Icon example shows how to add an icon with a menu
and popup messages to a desktop environment's system tray.
\image systemtray-example.png Screenshot of the System Tray Icon.
@@ -47,7 +46,7 @@
The editor allows the user to choose the preferred icon as well as
set the balloon message's type and duration. The user can also
- edit the message's title and body. Finally, the editor provide a
+ edit the message's title and body. Finally, the editor provides a
checkbox controlling whether the icon is actually shown in the
system tray, or not.
@@ -65,8 +64,8 @@
check whether a system tray is present on the user's desktop, call
the static QSystemTrayIcon::isSystemTrayAvailable()
function. Associated with the icon, we provide a menu containing
- the typical \gui minimize, \gui maximize, \gui restore and \gui
- quit actions. We reimplement the QWidget::setVisible() function to
+ the typical \uicontrol minimize, \uicontrol maximize, \uicontrol restore and
+ \uicontrol quit actions. We reimplement the QWidget::setVisible() function to
update the tray icon's menu whenever the editor's appearance
changes, e.g., when maximizing or minimizing the main application
window.
@@ -74,7 +73,7 @@
Finally, we reimplement QWidget's \l {QWidget::}{closeEvent()}
function to be able to inform the user (when closing the editor
window) that the program will keep running in the system tray
- until the user chooses the \gui Quit entry in the icon's context
+ until the user chooses the \uicontrol Quit entry in the icon's context
menu.
\section1 Window Class Implementation
diff --git a/examples/widgets/doc/src/fridgemagnets.qdoc b/examples/widgets/doc/src/fridgemagnets.qdoc
index 5e1052b413..bf3343af0e 100644
--- a/examples/widgets/doc/src/fridgemagnets.qdoc
+++ b/examples/widgets/doc/src/fridgemagnets.qdoc
@@ -28,6 +28,8 @@
/*!
\example draganddrop/fridgemagnets
\title Fridge Magnets Example
+ \brief The Fridge Magnets example illustrates how to move around several types of
+ MIME-encoded data with drag and drop.
The Fridge Magnets example shows how to supply more than one type
of MIME-encoded data with a drag and drop operation.
diff --git a/examples/widgets/doc/src/systray.qdoc b/examples/widgets/doc/src/systray.qdoc
deleted file mode 100644
index b05f999dfa..0000000000
--- a/examples/widgets/doc/src/systray.qdoc
+++ /dev/null
@@ -1,179 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** 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. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \example desktop/systray
- \title System Tray Icon Example
- \ingroup examples-widgets
- \brief The System Tray Icon example shows how to add an icon with a menu
- and popup messages to a desktop environment's system tray.
-
- \image systemtray-example.png Screenshot of the System Tray Icon.
-
- Modern operating systems usually provide a special area on the
- desktop, called the system tray or notification area, where
- long-running applications can display icons and short messages.
-
- This example consists of one single class, \c Window, providing
- the main application window (i.e., an editor for the system tray
- icon) and the associated icon.
-
- \image systemtray-editor.png
-
- The editor allows the user to choose the preferred icon as well as
- set the balloon message's type and duration. The user can also
- edit the message's title and body. Finally, the editor provides a
- checkbox controlling whether the icon is actually shown in the
- system tray, or not.
-
- \section1 Window Class Definition
-
- The \c Window class inherits QWidget:
-
- \snippet desktop/systray/window.h 0
-
- We implement several private slots to respond to user
- interaction. The other private functions are only convenience
- functions provided to simplify the constructor.
-
- The tray icon is an instance of the QSystemTrayIcon class. To
- check whether a system tray is present on the user's desktop, call
- the static QSystemTrayIcon::isSystemTrayAvailable()
- function. Associated with the icon, we provide a menu containing
- the typical \uicontrol minimize, \uicontrol maximize, \uicontrol restore and
- \uicontrol quit actions. We reimplement the QWidget::setVisible() function
- to update the tray icon's menu whenever the editor's appearance
- changes, e.g., when maximizing or minimizing the main application
- window.
-
- Finally, we reimplement QWidget's \l {QWidget::}{closeEvent()}
- function to be able to inform the user (when closing the editor
- window) that the program will keep running in the system tray
- until the user chooses the \uicontrol Quit entry in the icon's context
- menu.
-
- \section1 Window Class Implementation
-
- When constructing the editor widget, we first create the various
- editor elements before we create the actual system tray icon:
-
- \snippet desktop/systray/window.cpp 0
-
- We ensure that the application responds to user input by
- connecting most of the editor's input widgets (including the
- system tray icon) to the application's private slots. But note the
- visibility checkbox; its \l {QCheckBox::}{toggled()} signal is
- connected to the \e {icon}'s \l {QSystemTrayIcon::}{setVisible()}
- function instead.
-
- \snippet desktop/systray/window.cpp 3
-
- The \c setIcon() slot is triggered whenever the current index in
- the icon combobox changes, i.e., whenever the user chooses another
- icon in the editor. Note that it is also called when the user
- activates the tray icon with the left mouse button, triggering the
- icon's \l {QSystemTrayIcon::}{activated()} signal. We will come
- back to this signal shortly.
-
- The QSystemTrayIcon::setIcon() function sets the \l
- {QSystemTrayIcon::}{icon} property that holds the actual system
- tray icon. On Windows, the system tray icon size is 16x16; on X11,
- the preferred size is 22x22. The icon will be scaled to the
- appropriate size as necessary.
-
- Note that on X11, due to a limitation in the system tray
- specification, mouse clicks on transparent areas in the icon are
- propagated to the system tray. If this behavior is unacceptable,
- we suggest using an icon with no transparency.
-
- \snippet desktop/systray/window.cpp 4
-
- Whenever the user activates the system tray icon, it emits its \l
- {QSystemTrayIcon::}{activated()} signal passing the triggering
- reason as parameter. QSystemTrayIcon provides the \l
- {QSystemTrayIcon::}{ActivationReason} enum to describe how the
- icon was activated.
-
- In the constructor, we connected our icon's \l
- {QSystemTrayIcon::}{activated()} signal to our custom \c
- iconActivated() slot: If the user has clicked the icon using the
- left mouse button, this function changes the icon image by
- incrementing the icon combobox's current index, triggering the \c
- setIcon() slot as mentioned above. If the user activates the icon
- using the middle mouse button, it calls the custom \c
- showMessage() slot:
-
- \snippet desktop/systray/window.cpp 5
-
- When the \e showMessage() slot is triggered, we first retrieve the
- message icon depending on the currently chosen message type. The
- QSystemTrayIcon::MessageIcon enum describes the icon that is shown
- when a balloon message is displayed. Then we call
- QSystemTrayIcon's \l {QSystemTrayIcon::}{showMessage()} function
- to show the message with the title, body, and icon for the time
- specified in milliseconds.
-
- QSystemTrayIcon also has the corresponding, \l {QSystemTrayIcon::}
- {messageClicked()} signal, which is emitted when the user clicks a
- message displayed by \l {QSystemTrayIcon::}{showMessage()}.
-
- \snippet desktop/systray/window.cpp 6
-
- In the constructor, we connected the \l
- {QSystemTrayIcon::}{messageClicked()} signal to our custom \c
- messageClicked() slot that simply displays a message using the
- QMessageBox class.
-
- QMessageBox provides a modal dialog with a short message, an icon,
- and buttons laid out depending on the current style. It supports
- four severity levels: "Question", "Information", "Warning" and
- "Critical". The easiest way to pop up a message box in Qt is to
- call one of the associated static functions, e.g.,
- QMessageBox::information().
-
- As we mentioned earlier, we reimplement a couple of QWidget's
- virtual functions:
-
- \snippet desktop/systray/window.cpp 1
-
- Our reimplementation of the QWidget::setVisible() function updates
- the tray icon's menu whenever the editor's appearance changes,
- e.g., when maximizing or minimizing the main application window,
- before calling the base class implementation.
-
- \snippet desktop/systray/window.cpp 2
-
- We have reimplemented the QWidget::closeEvent() event handler to
- receive widget close events, showing the above message to the
- users when they are closing the editor window.
-
- In addition to the functions and slots discussed above, we have
- also implemented several convenience functions to simplify the
- constructor: \c createIconGroupBox(), \c createMessageGroupBox(),
- \c createActions() and \c createTrayIcon(). See the \l
- {desktop/systray/window.cpp}{window.cpp} file for details.
-*/
diff --git a/examples/widgets/doc/src/tablet.qdoc b/examples/widgets/doc/src/tablet.qdoc
index bc03d46332..88012fd30f 100644
--- a/examples/widgets/doc/src/tablet.qdoc
+++ b/examples/widgets/doc/src/tablet.qdoc
@@ -34,41 +34,41 @@
\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.
+ generated. You need to reimplement the \l{QWidget::}{tabletEvent()} event
+ handler if you want to handle tablet events. Events are generated when the
+ tool (stylus) used for drawing enters and leaves the proximity of the
+ tablet (i.e., when it is close but not pressed down on it), when the tool
+ is pressed down and released from it, when the tool is moved across the
+ tablet, and when one of the buttons on the tool is pressed or released.
+
+ The information available in QTabletEvent depends on the device used.
+ This example can handle a tablet with up to three different drawing tools:
+ a stylus, an airbrush, and an art pen. For any of these the event will
+ contain the position of the tool, pressure on the tablet, button status,
+ vertical tilt, and horizontal tilt (i.e, the angle between the device and
+ the perpendicular of the tablet, if the tablet hardware can provide it).
+ The airbrush has a finger wheel; the position of this is also available
+ in the tablet event. The art pen provides rotation around the axis
+ perpendicular to the tablet surface, so that it can be used for calligraphy.
+
+ 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 virtual paint; the finger wheel is used to
+ change the density of the spray. When you draw with the art pen, you get a
+ a line whose width and endpoint angle depend on the rotation of the pen.
+ The pressure and tilt can also be assigned to change the alpha and
+ saturation values of the color and the width of the stroke.
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 MainWindow class inherits QMainWindow, creates
+ the menus, and connects 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.
+ receives tablet events. It uses the events to paint onto an
+ offscreen pixmap, and then renders it.
\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.
+ class handles tablet proximity events.
\li The \c main() function creates a \c MainWindow and shows it
as a top level window.
\endlist
@@ -81,110 +81,99 @@
\snippet 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.
-
+ \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 setAlphaValuator(), \c setSaturationValuator(), and
+ \c setLineWidthValuator() slots, which call functions in \c TabletCanvas.
\section1 MainWindow Class Implementation
- We start width a look at the constructor \c MainWindow():
+ We start with a look at the constructor \c MainWindow():
\snippet 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():
+ In the constructor we call \c createMenus() to create all the actions and
+ menus, and set the canvas as the center widget.
- \snippet widgets/tablet/mainwindow.cpp 1
+ \snippet widgets/tablet/mainwindow.cpp 8
- We let the user pick a color with a QColorDialog. If it is valid,
- we set a new drawing color with \c setColor().
+ At the beginning of \c createMenus() we populate the \b File menu.
+ We use an overload of \l{QMenu::}{addAction()}, introduced in Qt 5.6, to create
+ a menu item with a shortcut (and optionally an icon), add it to its menu,
+ and connect it to a slot, all with one line of code. We use QKeySequence to
+ get the platform-specific standard key shortcuts for these common menu items.
- Here is the implementation of \c alphaActionTriggered():
+ We also populate the \b Brush menu. The command to change a brush does not
+ normally have a standard shortcut, so we use \l{QObject::}{tr()} to enable
+ translating the shortcut along with the language translation of the application.
- \snippet widgets/tablet/mainwindow.cpp 2
+ Now we will look at the creation of one group of mutually-exclusive actions
+ in a submenu of the \b Tablet menu, for selecting which property of each
+ QTabletEvent will be used to vary the translucency (alpha channel) of the
+ line being drawn or color being airbrushed.
+ (See the \l{Application Example}{application example} if you want a
+ high-level introduction to QActions.)
- 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.
+ \snippet widgets/tablet/mainwindow.cpp 9
- Here is the implementation of \c lineWidthActionTriggered():
+ We want the user to be able to choose whether the drawing color's alpha
+ component should be modulated by the tablet pressure, tilt, or the position
+ of the thumbwheel on the airbrush tool. We have one action for each choice,
+ and an additional action to choose not to change the alpha, that is, to keep
+ the color 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 from the group when an action is checked,
+ so we connect that to \c MainWindow::setAlphaValuator(). It will need to know
+ which property (valuator) of the QTabletEvent to pay attention to from now
+ on, so we use the QAction::data property to pass this information along.
+ (In order for this to be possible, the enum \c Valuator must be a registered
+ metatype, so that it can be inserted into a QVariant. That is accomplished
+ by the \c Q_ENUM declaration in tabletcanvas.h.)
+
+ Here is the implementation of \c setAlphaValuator():
- \snippet widgets/tablet/mainwindow.cpp 3
+ \snippet widgets/tablet/mainwindow.cpp 2
- We check which action is selected in \c lineWidthGroup, and set
- how the canvas should change the drawing line width.
+ It simply needs to retrieve the \c Valuator enum from QAction::data(), and
+ pass that to \c TabletCanvas::setAlphaChannelValuator(). If we were not
+ using the \c data property, we would instead need to compare the QAction
+ pointer itself, for example in a switch statement. But that would require
+ keeping pointers to each QAction in class variables, for comparison purposes.
- Here is the implementation of \c saturationActionTriggered():
+ Here is the implementation of \c setBrushColor():
- \snippet widgets/tablet/mainwindow.cpp 4
+ \snippet widgets/tablet/mainwindow.cpp 1
- We check which action is selected in \c colorSaturationGroup, and
- set how the canvas should change the color saturation of the
- drawing color.
+ We do lazy initialization of a QColorDialog the first time the user
+ chooses \b {Brush color...} from the menu or via the action shortcut.
+ While the dialog is open, each time the user chooses a different color,
+ \c TabletCanvas::setColor() will be called to change the drawing color.
+ Because it is a non-modal dialog, the user is free to leave the color
+ dialog open, so as to be able to conveniently and frequently change colors,
+ or close it and re-open it later.
- Here is the implementation of \c saveAct():
+ Here is the implementation of \c save():
\snippet 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.
+ We use the QFileDialog to let the user select a file to save the drawing,
+ and then call \c TabletCanvas::saveImage() to actually write it to the
+ file.
- Here is the implementation of \c loadAct():
+ Here is the implementation of \c load():
\snippet 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().
+ 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():
+ Here is the implementation of \c about():
\snippet 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 widgets/tablet/mainwindow.cpp 8
- \dots
- \snippet 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 widgets/tablet/mainwindow.cpp 10
-
- Here is the implementation of \c createMenus():
-
- \snippet widgets/tablet/mainwindow.cpp 11
-
- We create the menus of the example and add the actions to them.
-
\section1 TabletCanvas Class Definition
@@ -193,24 +182,22 @@
\snippet 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.
+ The canvas can change the alpha channel, color saturation, and line width
+ of the stroke. We have an enum listing the QTabletEvent properties with
+ which it is possible to modulate them. We keep a private variable for each:
+ \c m_alphaChannelValuator, \c m_colorSaturationValuator and
+ \c m_lineWidthValuator, and we provide accessor functions for them.
- 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.
+ We draw on a QPixmap with \c m_pen and \c m_brush using \c m_color.
+ Each time a QTabletEvent is received, the stroke is drawn from
+ \c lastPoint to the point given in the current QTabletEvent,
+ and then the position and rotation are saved in \c lastPoint for next time.
+ The \c saveImage() and \c loadImage() functions save and load the QPixmap to disk.
+ The pixmap is drawn on the widget in \c paintEvent().
- 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().
+ The interpretation of events from the tablet is done in \c tabletEvent(), and
+ \c paintPixmap(), \c updateBrush(), and \c updateCursor() are helper
+ functions used by \c tabletEvent().
\section1 TabletCanvas Class Implementation
@@ -233,21 +220,28 @@
\snippet widgets/tablet/tabletcanvas.cpp 2
- We simply call \l{QPixmap::}{load()}, which loads the image in \a
- file.
+ We simply call \l{QPixmap::}{load()}, which loads the image from \a file.
Here is the implementation of \c tabletEvent():
\snippet 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.
+ We get three kind of events to this function: \c TabletPress, \c TabletRelease,
+ and \c TabletMove, which are generated when a drawing tool is pressed down on,
+ lifed up from, or moved across the tablet. We set \c m_deviceDown to \c true
+ when a device is pressed down on the tablet; we then know that we should
+ draw when we receive move events. We have implemented \c updateBrush()
+ to update \c m_brush and \c m_pen depending on which of the tablet event
+ properties the user has chosen to pay attention to. The \c updateCursor()
+ function selects a cursor to represent the drawing tool in use, so that
+ as you hover with the tool in proximity of the tablet, you can see what
+ kind of stroke you are about to make.
+
+ \snippet widgets/tablet/tabletcanvas.cpp 12
+
+ If an art pen (\c RotationStylus) is in use, \c updateCursor()
+ is also called for each \c TabletMove event, and renders a rotated cursor
+ so that you can see the angle of the pen tip.
Here is the implementation of \c paintEvent():
@@ -259,22 +253,22 @@
\snippet 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 from
+ In this function we draw on the pixmap based on the movement of the tool.
+ If the tool used on the tablet is a stylus, we want to draw a line from
the last-known position to the current position. We also assume that this
is a reasonable handling of any unknown device, but update the status bar
with a warning. If it is an airbrush, we want to draw a circle filled with
a soft gradient, whose density can depend on various event parameters.
By default it depends on the tangential pressure, which is the position of
- the finger wheel on the airbrush. If it is a rotation stylus, we simulate
- a felt marker by drawing trapezoidal strokes.
+ the finger wheel on the airbrush. If the tool is a rotation stylus, we
+ simulate a felt marker by drawing trapezoidal stroke segments.
\snippet widgets/tablet/tabletcanvas.cpp 6
- 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:
+ In \c updateBrush() we set the pen and brush used for drawing to match
+ \c m_alphaChannelValuator, \c m_lineWidthValuator, \c m_colorSaturationValuator,
+ and \c m_color. We will examine the code to set up \c m_brush and
+ \c m_pen for each of these variables:
\snippet widgets/tablet/tabletcanvas.cpp 7
@@ -288,34 +282,33 @@
\snippet 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.
+ The alpha channel of QColor is given as a number between 0 and 255 where 0
+ is transparent and 255 is opaque, or as a floating-point number where 0 is
+ transparent and 1.0 is opaque. \l{QTabletEvent::}{pressure()} returns the
+ pressure as a qreal between 0.0 and 1.0. 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 values.
\snippet 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.
+ The color saturation in the HSV color model can be given as an integer
+ between 0 and 255 or as a floating-point value between 0 and 1. We chose to
+ represent alpha as an integer, so we call \l{QColor::}{setHsv()} with
+ integer values. That means we need to multiply the pressure to a number
+ between 0 and 255.
\snippet 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.
+ The width of the pen stroke can increase with pressure, if so chosen.
+ But when the pen width is controlled by tilt, we let the width increase
+ with the angle between the tool and the perpendicular of the tablet.
\snippet 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.
+ the pixmap and let the pressure decide the pen width, else we set
+ the colors we have decided previously in the function.
\section1 TabletApplication Class Definition
@@ -325,13 +318,11 @@
\snippet 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.
+ \c TabletApplication exists as a subclass of QApplication in order to
+ receive tablet proximity events and forward them to \c TabletCanvas.
+ The \c TabletEnterProximity and \c TabletLeaveProximity events are sent to
+ the QApplication object, while other tablet events are sent to the QWidget's
+ \c event() hander, which sends them on to \l{QWidget::}{tabletEvent()}.
\section1 TabletApplication Class Implementation
@@ -340,24 +331,24 @@
\snippet 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.
+ We use this function to handle the \c TabletEnterProximity and
+ \c TabletLeaveProximity events, which are generated when a drawing
+ tool enters or leaves the proximity of the tablet. Here we call
+ \c TabletCanvas::setTabletDevice(), which then calls \c updateCursor(),
+ which will set an appropriate cursor. This is the only reason we
+ need the proximity events; for the purpose of correct drawing, it is
+ enough for \c TabletCanvas to observe the \l{QTabletEvent::}{device()} and
+ \l{QTabletEvent::}{pointerType()} in each event that it receives.
+
\section1 The \c main() function
- Here is the examples \c main() function:
+ Here is the example's \c main() function:
\snippet 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.
+ Here we create a \c MainWindow 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.
*/
diff --git a/examples/widgets/tools/codecs/doc/src/codecs.qdoc b/examples/widgets/tools/codecs/doc/src/codecs.qdoc
index b640d95c38..69bf1470b1 100644
--- a/examples/widgets/tools/codecs/doc/src/codecs.qdoc
+++ b/examples/widgets/tools/codecs/doc/src/codecs.qdoc
@@ -28,6 +28,7 @@
/*!
\example tools/codecs
\title Text Codecs Example
+ \brief How to import and export text using text codecs.
The Text Codecs example demonstrates the principles behind importing and exporting text
using codecs to ensure that characters are encoded properly, avoiding loss of data
diff --git a/examples/widgets/widgets/tablet/mainwindow.cpp b/examples/widgets/widgets/tablet/mainwindow.cpp
index 5e84f5b6a2..950a5a2e29 100644
--- a/examples/widgets/widgets/tablet/mainwindow.cpp
+++ b/examples/widgets/widgets/tablet/mainwindow.cpp
@@ -45,237 +45,172 @@
//! [0]
MainWindow::MainWindow(TabletCanvas *canvas)
+ : m_canvas(canvas), m_colorDialog(Q_NULLPTR)
{
- myCanvas = canvas;
- createActions();
createMenus();
-
- myCanvas->setColor(Qt::red);
- myCanvas->setLineWidthType(TabletCanvas::LineWidthPressure);
- myCanvas->setAlphaChannelType(TabletCanvas::AlphaTangentialPressure);
- myCanvas->setColorSaturationType(TabletCanvas::NoSaturation);
-
setWindowTitle(tr("Tablet Example"));
- setCentralWidget(myCanvas);
+ setCentralWidget(m_canvas);
}
//! [0]
//! [1]
-void MainWindow::brushColorAct()
+void MainWindow::setBrushColor()
{
- QColor color = QColorDialog::getColor(myCanvas->color());
-
- if (color.isValid())
- myCanvas->setColor(color);
+ if (!m_colorDialog) {
+ m_colorDialog = new QColorDialog(this);
+ m_colorDialog->setModal(false);
+ m_colorDialog->setCurrentColor(m_canvas->color());
+ connect(m_colorDialog, &QColorDialog::colorSelected, m_canvas, &TabletCanvas::setColor);
+ }
+ m_colorDialog->setVisible(true);
}
//! [1]
//! [2]
-void MainWindow::alphaActionTriggered(QAction *action)
+void MainWindow::setAlphaValuator(QAction *action)
{
- if (action == alphaChannelPressureAction) {
- myCanvas->setAlphaChannelType(TabletCanvas::AlphaPressure);
- } else if (action == alphaChannelTangentialPressureAction) {
- myCanvas->setAlphaChannelType(TabletCanvas::AlphaTangentialPressure);
- } else if (action == alphaChannelTiltAction) {
- myCanvas->setAlphaChannelType(TabletCanvas::AlphaTilt);
- } else {
- myCanvas->setAlphaChannelType(TabletCanvas::NoAlpha);
- }
+ m_canvas->setAlphaChannelValuator(action->data().value<TabletCanvas::Valuator>());
}
//! [2]
//! [3]
-void MainWindow::lineWidthActionTriggered(QAction *action)
+void MainWindow::setLineWidthValuator(QAction *action)
{
- if (action == lineWidthPressureAction) {
- myCanvas->setLineWidthType(TabletCanvas::LineWidthPressure);
- } else if (action == lineWidthTiltAction) {
- myCanvas->setLineWidthType(TabletCanvas::LineWidthTilt);
- } else {
- myCanvas->setLineWidthType(TabletCanvas::NoLineWidth);
- }
+ m_canvas->setLineWidthType(action->data().value<TabletCanvas::Valuator>());
}
//! [3]
//! [4]
-void MainWindow::saturationActionTriggered(QAction *action)
+void MainWindow::setSaturationValuator(QAction *action)
{
- if (action == colorSaturationVTiltAction) {
- myCanvas->setColorSaturationType(TabletCanvas::SaturationVTilt);
- } else if (action == colorSaturationHTiltAction) {
- myCanvas->setColorSaturationType(TabletCanvas::SaturationHTilt);
- } else if (action == colorSaturationPressureAction) {
- myCanvas->setColorSaturationType(TabletCanvas::SaturationPressure);
- } else {
- myCanvas->setColorSaturationType(TabletCanvas::NoSaturation);
- }
+ m_canvas->setColorSaturationValuator(action->data().value<TabletCanvas::Valuator>());
}
//! [4]
//! [5]
-void MainWindow::saveAct()
+void MainWindow::save()
{
QString path = QDir::currentPath() + "/untitled.png";
QString fileName = QFileDialog::getSaveFileName(this, tr("Save Picture"),
path);
- if (!myCanvas->saveImage(fileName))
+ if (!m_canvas->saveImage(fileName))
QMessageBox::information(this, "Error Saving Picture",
"Could not save the image");
}
//! [5]
//! [6]
-void MainWindow::loadAct()
+void MainWindow::load()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("Open Picture"),
QDir::currentPath());
- if (!myCanvas->loadImage(fileName))
+ if (!m_canvas->loadImage(fileName))
QMessageBox::information(this, "Error Opening Picture",
"Could not open picture");
}
//! [6]
//! [7]
-void MainWindow::aboutAct()
+void MainWindow::about()
{
QMessageBox::about(this, tr("About Tablet Example"),
- tr("This example shows use of a Wacom tablet in Qt"));
+ tr("This example shows how to use a graphics drawing tablet in Qt."));
}
//! [7]
//! [8]
-void MainWindow::createActions()
+void MainWindow::createMenus()
{
+ QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
+ fileMenu->addAction(tr("&Open..."), this, &MainWindow::load, QKeySequence::Open);
+ fileMenu->addAction(tr("&Save As..."), this, &MainWindow::save, QKeySequence::SaveAs);
+ fileMenu->addAction(tr("E&xit"), this, &MainWindow::close, QKeySequence::Quit);
+
+ QMenu *brushMenu = menuBar()->addMenu(tr("&Brush"));
+ brushMenu->addAction(tr("&Brush Color..."), this, &MainWindow::setBrushColor, tr("Ctrl+B"));
//! [8]
- brushColorAction = new QAction(tr("&Brush Color..."), this);
- brushColorAction->setShortcut(tr("Ctrl+C"));
- connect(brushColorAction, SIGNAL(triggered()),
- this, SLOT(brushColorAct()));
+
+ QMenu *tabletMenu = menuBar()->addMenu(tr("&Tablet"));
+ QMenu *lineWidthMenu = tabletMenu->addMenu(tr("&Line Width"));
+
+ QAction *lineWidthPressureAction = lineWidthMenu->addAction(tr("&Pressure"));
+ lineWidthPressureAction->setData(TabletCanvas::PressureValuator);
+ lineWidthPressureAction->setCheckable(true);
+ lineWidthPressureAction->setChecked(true);
+
+ QAction *lineWidthTiltAction = lineWidthMenu->addAction(tr("&Tilt"));
+ lineWidthTiltAction->setData(TabletCanvas::TiltValuator);
+ lineWidthTiltAction->setCheckable(true);
+
+ QAction *lineWidthFixedAction = lineWidthMenu->addAction(tr("&Fixed"));
+ lineWidthFixedAction->setData(TabletCanvas::NoValuator);
+ lineWidthFixedAction->setCheckable(true);
+
+ QActionGroup *lineWidthGroup = new QActionGroup(this);
+ lineWidthGroup->addAction(lineWidthPressureAction);
+ lineWidthGroup->addAction(lineWidthTiltAction);
+ lineWidthGroup->addAction(lineWidthFixedAction);
+ connect(lineWidthGroup, &QActionGroup::triggered, this,
+ &MainWindow::setLineWidthValuator);
//! [9]
- alphaChannelPressureAction = new QAction(tr("&Pressure"), this);
+ QMenu *alphaChannelMenu = tabletMenu->addMenu(tr("&Alpha Channel"));
+ QAction *alphaChannelPressureAction = alphaChannelMenu->addAction(tr("&Pressure"));
+ alphaChannelPressureAction->setData(TabletCanvas::PressureValuator);
alphaChannelPressureAction->setCheckable(true);
- alphaChannelTangentialPressureAction = new QAction(tr("T&angential Pressure"), this);
+ QAction *alphaChannelTangentialPressureAction = alphaChannelMenu->addAction(tr("T&angential Pressure"));
+ alphaChannelTangentialPressureAction->setData(TabletCanvas::TangentialPressureValuator);
alphaChannelTangentialPressureAction->setCheckable(true);
alphaChannelTangentialPressureAction->setChecked(true);
- alphaChannelTiltAction = new QAction(tr("&Tilt"), this);
+ QAction *alphaChannelTiltAction = alphaChannelMenu->addAction(tr("&Tilt"));
+ alphaChannelTiltAction->setData(TabletCanvas::TiltValuator);
alphaChannelTiltAction->setCheckable(true);
- noAlphaChannelAction = new QAction(tr("No Alpha Channel"), this);
+ QAction *noAlphaChannelAction = alphaChannelMenu->addAction(tr("No Alpha Channel"));
+ noAlphaChannelAction->setData(TabletCanvas::NoValuator);
noAlphaChannelAction->setCheckable(true);
- alphaChannelGroup = new QActionGroup(this);
+ QActionGroup *alphaChannelGroup = new QActionGroup(this);
alphaChannelGroup->addAction(alphaChannelPressureAction);
alphaChannelGroup->addAction(alphaChannelTangentialPressureAction);
alphaChannelGroup->addAction(alphaChannelTiltAction);
alphaChannelGroup->addAction(noAlphaChannelAction);
- connect(alphaChannelGroup, SIGNAL(triggered(QAction*)),
- this, SLOT(alphaActionTriggered(QAction*)));
-
+ connect(alphaChannelGroup, &QActionGroup::triggered,
+ this, &MainWindow::setAlphaValuator);
//! [9]
- colorSaturationVTiltAction = new QAction(tr("&Vertical Tilt"), this);
+
+ QMenu *colorSaturationMenu = tabletMenu->addMenu(tr("&Color Saturation"));
+
+ QAction *colorSaturationVTiltAction = colorSaturationMenu->addAction(tr("&Vertical Tilt"));
+ colorSaturationVTiltAction->setData(TabletCanvas::VTiltValuator);
colorSaturationVTiltAction->setCheckable(true);
- colorSaturationHTiltAction = new QAction(tr("&Horizontal Tilt"), this);
+ QAction *colorSaturationHTiltAction = colorSaturationMenu->addAction(tr("&Horizontal Tilt"));
+ colorSaturationHTiltAction->setData(TabletCanvas::HTiltValuator);
colorSaturationHTiltAction->setCheckable(true);
- colorSaturationPressureAction = new QAction(tr("&Pressure"), this);
+ QAction *colorSaturationPressureAction = colorSaturationMenu->addAction(tr("&Pressure"));
+ colorSaturationPressureAction->setData(TabletCanvas::PressureValuator);
colorSaturationPressureAction->setCheckable(true);
- noColorSaturationAction = new QAction(tr("&No Color Saturation"), this);
+ QAction *noColorSaturationAction = colorSaturationMenu->addAction(tr("&No Color Saturation"));
+ noColorSaturationAction->setData(TabletCanvas::NoValuator);
noColorSaturationAction->setCheckable(true);
noColorSaturationAction->setChecked(true);
- colorSaturationGroup = new QActionGroup(this);
+ QActionGroup *colorSaturationGroup = new QActionGroup(this);
colorSaturationGroup->addAction(colorSaturationVTiltAction);
colorSaturationGroup->addAction(colorSaturationHTiltAction);
colorSaturationGroup->addAction(colorSaturationPressureAction);
colorSaturationGroup->addAction(noColorSaturationAction);
- connect(colorSaturationGroup, SIGNAL(triggered(QAction*)),
- this, SLOT(saturationActionTriggered(QAction*)));
-
- lineWidthPressureAction = new QAction(tr("&Pressure"), this);
- lineWidthPressureAction->setCheckable(true);
- lineWidthPressureAction->setChecked(true);
-
- lineWidthTiltAction = new QAction(tr("&Tilt"), this);
- lineWidthTiltAction->setCheckable(true);
-
- lineWidthFixedAction = new QAction(tr("&Fixed"), this);
- lineWidthFixedAction->setCheckable(true);
-
- lineWidthGroup = new QActionGroup(this);
- lineWidthGroup->addAction(lineWidthPressureAction);
- lineWidthGroup->addAction(lineWidthTiltAction);
- lineWidthGroup->addAction(lineWidthFixedAction);
- connect(lineWidthGroup, SIGNAL(triggered(QAction*)),
- this, SLOT(lineWidthActionTriggered(QAction*)));
-
- exitAction = new QAction(tr("E&xit"), this);
- exitAction->setShortcuts(QKeySequence::Quit);
- connect(exitAction, SIGNAL(triggered()),
- this, SLOT(close()));
-
- loadAction = new QAction(tr("&Open..."), this);
- loadAction->setShortcuts(QKeySequence::Open);
- connect(loadAction, SIGNAL(triggered()),
- this, SLOT(loadAct()));
-
- saveAction = new QAction(tr("&Save As..."), this);
- saveAction->setShortcuts(QKeySequence::SaveAs);
- connect(saveAction, SIGNAL(triggered()),
- this, SLOT(saveAct()));
-
- aboutAction = new QAction(tr("A&bout"), this);
- aboutAction->setShortcut(tr("Ctrl+B"));
- connect(aboutAction, SIGNAL(triggered()),
- this, SLOT(aboutAct()));
-
- aboutQtAction = new QAction(tr("About &Qt"), this);
- aboutQtAction->setShortcut(tr("Ctrl+Q"));
- connect(aboutQtAction, SIGNAL(triggered()),
- qApp, SLOT(aboutQt()));
-//! [10]
-}
-//! [10]
-
-//! [11]
-void MainWindow::createMenus()
-{
- fileMenu = menuBar()->addMenu(tr("&File"));
- fileMenu->addAction(loadAction);
- fileMenu->addAction(saveAction);
- fileMenu->addSeparator();
- fileMenu->addAction(exitAction);
-
- brushMenu = menuBar()->addMenu(tr("&Brush"));
- brushMenu->addAction(brushColorAction);
-
- tabletMenu = menuBar()->addMenu(tr("&Tablet"));
-
- lineWidthMenu = tabletMenu->addMenu(tr("&Line Width"));
- lineWidthMenu->addAction(lineWidthPressureAction);
- lineWidthMenu->addAction(lineWidthTiltAction);
- lineWidthMenu->addAction(lineWidthFixedAction);
-
- alphaChannelMenu = tabletMenu->addMenu(tr("&Alpha Channel"));
- alphaChannelMenu->addAction(alphaChannelPressureAction);
- alphaChannelMenu->addAction(alphaChannelTangentialPressureAction);
- alphaChannelMenu->addAction(alphaChannelTiltAction);
- alphaChannelMenu->addAction(noAlphaChannelAction);
-
- colorSaturationMenu = tabletMenu->addMenu(tr("&Color Saturation"));
- colorSaturationMenu->addAction(colorSaturationVTiltAction);
- colorSaturationMenu->addAction(colorSaturationHTiltAction);
- colorSaturationMenu->addAction(noColorSaturationAction);
+ connect(colorSaturationGroup, &QActionGroup::triggered,
+ this, &MainWindow::setSaturationValuator);
- helpMenu = menuBar()->addMenu("&Help");
- helpMenu->addAction(aboutAction);
- helpMenu->addAction(aboutQtAction);
+ QMenu *helpMenu = menuBar()->addMenu("&Help");
+ helpMenu->addAction(tr("A&bout"), this, &MainWindow::about);
+ helpMenu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt);
}
-//! [11]
diff --git a/examples/widgets/widgets/tablet/mainwindow.h b/examples/widgets/widgets/tablet/mainwindow.h
index c6ac2e6026..23d587baac 100644
--- a/examples/widgets/widgets/tablet/mainwindow.h
+++ b/examples/widgets/widgets/tablet/mainwindow.h
@@ -44,10 +44,7 @@
#include <QMainWindow>
QT_BEGIN_NAMESPACE
-class QAction;
-class QActionGroup;
-class QMenu;
-class QStatusBar;
+class QColorDialog;
QT_END_NAMESPACE
class TabletCanvas;
@@ -60,54 +57,19 @@ public:
MainWindow(TabletCanvas *canvas);
private slots:
- void brushColorAct();
- void alphaActionTriggered(QAction *action);
- void lineWidthActionTriggered(QAction *action);
- void saturationActionTriggered(QAction *action);
- void saveAct();
- void loadAct();
- void aboutAct();
+ void setBrushColor();
+ void setAlphaValuator(QAction *action);
+ void setLineWidthValuator(QAction *action);
+ void setSaturationValuator(QAction *action);
+ void save();
+ void load();
+ void about();
private:
- void createActions();
void createMenus();
- TabletCanvas *myCanvas;
-
- QAction *brushColorAction;
- QActionGroup *brushActionGroup;
-
- QActionGroup *alphaChannelGroup;
- QAction *alphaChannelPressureAction;
- QAction *alphaChannelTangentialPressureAction;
- QAction *alphaChannelTiltAction;
- QAction *noAlphaChannelAction;
-
- QActionGroup *colorSaturationGroup;
- QAction *colorSaturationVTiltAction;
- QAction *colorSaturationHTiltAction;
- QAction *colorSaturationPressureAction;
- QAction *noColorSaturationAction;
-
- QActionGroup *lineWidthGroup;
- QAction *lineWidthPressureAction;
- QAction *lineWidthTiltAction;
- QAction *lineWidthFixedAction;
-
- QAction *exitAction;
- QAction *saveAction;
- QAction *loadAction;
-
- QAction *aboutAction;
- QAction *aboutQtAction;
-
- QMenu *fileMenu;
- QMenu *brushMenu;
- QMenu *tabletMenu;
- QMenu *helpMenu;
- QMenu *colorSaturationMenu;
- QMenu *lineWidthMenu;
- QMenu *alphaChannelMenu;
+ TabletCanvas *m_canvas;
+ QColorDialog *m_colorDialog;
};
//! [0]
diff --git a/examples/widgets/widgets/tablet/tabletapplication.cpp b/examples/widgets/widgets/tablet/tabletapplication.cpp
index 3e1356ee9c..7c0912c8f9 100644
--- a/examples/widgets/widgets/tablet/tabletapplication.cpp
+++ b/examples/widgets/widgets/tablet/tabletapplication.cpp
@@ -47,7 +47,7 @@ bool TabletApplication::event(QEvent *event)
{
if (event->type() == QEvent::TabletEnterProximity ||
event->type() == QEvent::TabletLeaveProximity) {
- myCanvas->setTabletDevice(static_cast<QTabletEvent *>(event));
+ m_canvas->setTabletDevice(static_cast<QTabletEvent *>(event));
return true;
}
return QApplication::event(event);
diff --git a/examples/widgets/widgets/tablet/tabletapplication.h b/examples/widgets/widgets/tablet/tabletapplication.h
index d755ff9891..be238b9a0d 100644
--- a/examples/widgets/widgets/tablet/tabletapplication.h
+++ b/examples/widgets/widgets/tablet/tabletapplication.h
@@ -56,10 +56,10 @@ public:
bool event(QEvent *event) Q_DECL_OVERRIDE;
void setCanvas(TabletCanvas *canvas)
- { myCanvas = canvas; }
+ { m_canvas = canvas; }
private:
- TabletCanvas *myCanvas;
+ TabletCanvas *m_canvas;
};
//! [0]
diff --git a/examples/widgets/widgets/tablet/tabletcanvas.cpp b/examples/widgets/widgets/tablet/tabletcanvas.cpp
index 8ff3d41e0e..0d2fc2a958 100644
--- a/examples/widgets/widgets/tablet/tabletcanvas.cpp
+++ b/examples/widgets/widgets/tablet/tabletcanvas.cpp
@@ -45,17 +45,18 @@
//! [0]
TabletCanvas::TabletCanvas()
+ : QWidget(Q_NULLPTR)
+ , m_alphaChannelValuator(TangentialPressureValuator)
+ , m_colorSaturationValuator(NoValuator)
+ , m_lineWidthValuator(PressureValuator)
+ , m_color(Qt::red)
+ , m_brush(m_color)
+ , m_pen(m_brush, 1.0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)
+ , m_deviceDown(false)
{
resize(500, 500);
- myColor = Qt::red;
- myBrush = QBrush(myColor);
- myPen = QPen(myBrush, 1.0, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
initPixmap();
setAutoFillBackground(true);
- deviceDown = false;
- alphaChannelType = AlphaTangentialPressure;
- colorSaturationType = NoSaturation;
- lineWidthType = LineWidthPressure;
}
void TabletCanvas::initPixmap()
@@ -63,24 +64,24 @@ void TabletCanvas::initPixmap()
QPixmap newPixmap = QPixmap(width(), height());
newPixmap.fill(Qt::white);
QPainter painter(&newPixmap);
- if (!pixmap.isNull())
- painter.drawPixmap(0, 0, pixmap);
+ if (!m_pixmap.isNull())
+ painter.drawPixmap(0, 0, m_pixmap);
painter.end();
- pixmap = newPixmap;
+ m_pixmap = newPixmap;
}
//! [0]
//! [1]
bool TabletCanvas::saveImage(const QString &file)
{
- return pixmap.save(file);
+ return m_pixmap.save(file);
}
//! [1]
//! [2]
bool TabletCanvas::loadImage(const QString &file)
{
- bool success = pixmap.load(file);
+ bool success = m_pixmap.load(file);
if (success) {
update();
@@ -96,8 +97,8 @@ void TabletCanvas::tabletEvent(QTabletEvent *event)
switch (event->type()) {
case QEvent::TabletPress:
- if (!deviceDown) {
- deviceDown = true;
+ if (!m_deviceDown) {
+ m_deviceDown = true;
lastPoint.pos = event->posF();
lastPoint.rotation = event->rotation();
}
@@ -105,17 +106,17 @@ void TabletCanvas::tabletEvent(QTabletEvent *event)
case QEvent::TabletMove:
if (event->device() == QTabletEvent::RotationStylus)
updateCursor(event);
- if (deviceDown) {
+ if (m_deviceDown) {
updateBrush(event);
- QPainter painter(&pixmap);
+ QPainter painter(&m_pixmap);
paintPixmap(painter, event);
lastPoint.pos = event->posF();
lastPoint.rotation = event->rotation();
}
break;
case QEvent::TabletRelease:
- if (deviceDown && event->buttons() == Qt::NoButton)
- deviceDown = false;
+ if (m_deviceDown && event->buttons() == Qt::NoButton)
+ m_deviceDown = false;
break;
default:
break;
@@ -128,7 +129,7 @@ void TabletCanvas::tabletEvent(QTabletEvent *event)
void TabletCanvas::paintEvent(QPaintEvent *)
{
QPainter painter(this);
- painter.drawPixmap(0, 0, pixmap);
+ painter.drawPixmap(0, 0, m_pixmap);
}
//! [4]
@@ -142,10 +143,10 @@ void TabletCanvas::paintPixmap(QPainter &painter, QTabletEvent *event)
case QTabletEvent::Airbrush:
{
painter.setPen(Qt::NoPen);
- QRadialGradient grad(lastPoint.pos, myPen.widthF() * 10.0);
- QColor color = myBrush.color();
+ QRadialGradient grad(lastPoint.pos, m_pen.widthF() * 10.0);
+ QColor color = m_brush.color();
color.setAlphaF(color.alphaF() * 0.25);
- grad.setColorAt(0, myBrush.color());
+ grad.setColorAt(0, m_brush.color());
grad.setColorAt(0.5, Qt::transparent);
painter.setBrush(grad);
qreal radius = grad.radius();
@@ -154,11 +155,11 @@ void TabletCanvas::paintPixmap(QPainter &painter, QTabletEvent *event)
break;
case QTabletEvent::RotationStylus:
{
- myBrush.setStyle(Qt::SolidPattern);
+ m_brush.setStyle(Qt::SolidPattern);
painter.setPen(Qt::NoPen);
- painter.setBrush(myBrush);
+ painter.setBrush(m_brush);
QPolygonF poly;
- qreal halfWidth = myPen.widthF();
+ qreal halfWidth = m_pen.widthF();
QPointF brushAdjust(qSin(qDegreesToRadians(lastPoint.rotation)) * halfWidth,
qCos(qDegreesToRadians(lastPoint.rotation)) * halfWidth);
poly << lastPoint.pos + brushAdjust;
@@ -195,7 +196,7 @@ void TabletCanvas::paintPixmap(QPainter &painter, QTabletEvent *event)
}
// FALL-THROUGH
case QTabletEvent::Stylus:
- painter.setPen(myPen);
+ painter.setPen(m_pen);
painter.drawLine(lastPoint.pos, event->posF());
break;
}
@@ -206,68 +207,69 @@ void TabletCanvas::paintPixmap(QPainter &painter, QTabletEvent *event)
void TabletCanvas::updateBrush(const QTabletEvent *event)
{
int hue, saturation, value, alpha;
- myColor.getHsv(&hue, &saturation, &value, &alpha);
+ m_color.getHsv(&hue, &saturation, &value, &alpha);
int vValue = int(((event->yTilt() + 60.0) / 120.0) * 255);
int hValue = int(((event->xTilt() + 60.0) / 120.0) * 255);
//! [7] //! [8]
- switch (alphaChannelType) {
- case AlphaPressure:
- myColor.setAlphaF(event->pressure());
+ switch (m_alphaChannelValuator) {
+ case PressureValuator:
+ m_color.setAlphaF(event->pressure());
break;
- case AlphaTangentialPressure:
+ case TangentialPressureValuator:
if (event->device() == QTabletEvent::Airbrush)
- myColor.setAlphaF(qMax(0.01, (event->tangentialPressure() + 1.0) / 2.0));
+ m_color.setAlphaF(qMax(0.01, (event->tangentialPressure() + 1.0) / 2.0));
else
- myColor.setAlpha(255);
+ m_color.setAlpha(255);
break;
- case AlphaTilt:
- myColor.setAlpha(maximum(abs(vValue - 127), abs(hValue - 127)));
+ case TiltValuator:
+ m_color.setAlpha(maximum(abs(vValue - 127), abs(hValue - 127)));
break;
default:
- myColor.setAlpha(255);
+ m_color.setAlpha(255);
}
//! [8] //! [9]
- switch (colorSaturationType) {
- case SaturationVTilt:
- myColor.setHsv(hue, vValue, value, alpha);
+ switch (m_colorSaturationValuator) {
+ case VTiltValuator:
+ m_color.setHsv(hue, vValue, value, alpha);
break;
- case SaturationHTilt:
- myColor.setHsv(hue, hValue, value, alpha);
+ case HTiltValuator:
+ m_color.setHsv(hue, hValue, value, alpha);
break;
- case SaturationPressure:
- myColor.setHsv(hue, int(event->pressure() * 255.0), value, alpha);
+ case PressureValuator:
+ m_color.setHsv(hue, int(event->pressure() * 255.0), value, alpha);
break;
default:
;
}
//! [9] //! [10]
- switch (lineWidthType) {
- case LineWidthPressure:
- myPen.setWidthF(event->pressure() * 10 + 1);
+ switch (m_lineWidthValuator) {
+ case PressureValuator:
+ m_pen.setWidthF(event->pressure() * 10 + 1);
break;
- case LineWidthTilt:
- myPen.setWidthF(maximum(abs(vValue - 127), abs(hValue - 127)) / 12);
+ case TiltValuator:
+ m_pen.setWidthF(maximum(abs(vValue - 127), abs(hValue - 127)) / 12);
break;
default:
- myPen.setWidthF(1);
+ m_pen.setWidthF(1);
}
//! [10] //! [11]
if (event->pointerType() == QTabletEvent::Eraser) {
- myBrush.setColor(Qt::white);
- myPen.setColor(Qt::white);
- myPen.setWidthF(event->pressure() * 10 + 1);
+ m_brush.setColor(Qt::white);
+ m_pen.setColor(Qt::white);
+ m_pen.setWidthF(event->pressure() * 10 + 1);
} else {
- myBrush.setColor(myColor);
- myPen.setColor(myColor);
+ m_brush.setColor(m_color);
+ m_pen.setColor(m_color);
}
}
//! [11]
+//! [12]
void TabletCanvas::updateCursor(const QTabletEvent *event)
{
QCursor cursor;
@@ -285,7 +287,7 @@ void TabletCanvas::updateCursor(const QTabletEvent *event)
case QTabletEvent::RotationStylus: {
QImage origImg(QLatin1String(":/images/cursor-felt-marker.png"));
QImage img(32, 32, QImage::Format_ARGB32);
- QColor solid = myColor;
+ QColor solid = m_color;
solid.setAlpha(255);
img.fill(solid);
QPainter painter(&img);
@@ -307,6 +309,7 @@ void TabletCanvas::updateCursor(const QTabletEvent *event)
}
setCursor(cursor);
}
+//! [12]
void TabletCanvas::resizeEvent(QResizeEvent *)
{
diff --git a/examples/widgets/widgets/tablet/tabletcanvas.h b/examples/widgets/widgets/tablet/tabletcanvas.h
index a7335dbaf0..6044884d32 100644
--- a/examples/widgets/widgets/tablet/tabletcanvas.h
+++ b/examples/widgets/widgets/tablet/tabletcanvas.h
@@ -61,27 +61,26 @@ class TabletCanvas : public QWidget
Q_OBJECT
public:
- enum AlphaChannelType { AlphaPressure, AlphaTangentialPressure, AlphaTilt, NoAlpha };
- enum ColorSaturationType { SaturationVTilt, SaturationHTilt,
- SaturationPressure, NoSaturation };
- enum LineWidthType { LineWidthPressure, LineWidthTilt, NoLineWidth };
+ enum Valuator { PressureValuator, TangentialPressureValuator,
+ TiltValuator, VTiltValuator, HTiltValuator, NoValuator };
+ Q_ENUM(Valuator)
TabletCanvas();
bool saveImage(const QString &file);
bool loadImage(const QString &file);
- void setAlphaChannelType(AlphaChannelType type)
- { alphaChannelType = type; }
- void setColorSaturationType(ColorSaturationType type)
- { colorSaturationType = type; }
- void setLineWidthType(LineWidthType type)
- { lineWidthType = type; }
- void setColor(const QColor &color)
- { myColor = color; }
+ void setAlphaChannelValuator(Valuator type)
+ { m_alphaChannelValuator = type; }
+ void setColorSaturationValuator(Valuator type)
+ { m_colorSaturationValuator = type; }
+ void setLineWidthType(Valuator type)
+ { m_lineWidthValuator = type; }
+ void setColor(const QColor &c)
+ { if (c.isValid()) m_color = c; }
QColor color() const
- { return myColor; }
+ { return m_color; }
void setTabletDevice(QTabletEvent *event)
- { myTabletDevice = event->device(); updateCursor(event); }
+ { updateCursor(event); }
int maximum(int a, int b)
{ return a > b ? a : b; }
@@ -97,17 +96,14 @@ private:
void updateBrush(const QTabletEvent *event);
void updateCursor(const QTabletEvent *event);
- AlphaChannelType alphaChannelType;
- ColorSaturationType colorSaturationType;
- LineWidthType lineWidthType;
- QTabletEvent::PointerType pointerType;
- QTabletEvent::TabletDevice myTabletDevice;
- QColor myColor;
-
- QPixmap pixmap;
- QBrush myBrush;
- QPen myPen;
- bool deviceDown;
+ Valuator m_alphaChannelValuator;
+ Valuator m_colorSaturationValuator;
+ Valuator m_lineWidthValuator;
+ QColor m_color;
+ QPixmap m_pixmap;
+ QBrush m_brush;
+ QPen m_pen;
+ bool m_deviceDown;
struct Point {
QPointF pos;
diff --git a/examples/xml/dombookmarks/doc/src/dombookmarks.qdoc b/examples/xml/dombookmarks/doc/src/dombookmarks.qdoc
index 86d422de80..63e2e93654 100644
--- a/examples/xml/dombookmarks/doc/src/dombookmarks.qdoc
+++ b/examples/xml/dombookmarks/doc/src/dombookmarks.qdoc
@@ -29,6 +29,7 @@
\example dombookmarks
\title DOM Bookmarks Example
\ingroup xml-examples
+ \brief Provides a reader for XML Bookmark Exchange Language files
The DOM Bookmarks example provides a reader for XML Bookmark Exchange Language (XBEL)
files that uses Qt's DOM-based XML API to read and parse the files. The SAX Bookmarks
diff --git a/examples/xml/xmlstreamlint/doc/src/xmlstreamlint.qdoc b/examples/xml/xmlstreamlint/doc/src/xmlstreamlint.qdoc
index 48e6fe0734..d13708cb60 100644
--- a/examples/xml/xmlstreamlint/doc/src/xmlstreamlint.qdoc
+++ b/examples/xml/xmlstreamlint/doc/src/xmlstreamlint.qdoc
@@ -29,6 +29,8 @@
\example xmlstreamlint
\title XML Stream Lint Example
\ingroup xml-examples
+ \brief A commandline tool reading from an input file and writing to
+ the standard output file.
The XML Stream Lint example provides a simple command line utility that
accepts a file name as its single argument and writes it to the standard