diff options
Diffstat (limited to 'examples/widgets/tablet')
-rw-r--r-- | examples/widgets/tablet/main.cpp | 61 | ||||
-rw-r--r-- | examples/widgets/tablet/mainwindow.cpp | 275 | ||||
-rw-r--r-- | examples/widgets/tablet/mainwindow.h | 114 | ||||
-rw-r--r-- | examples/widgets/tablet/tablet.pro | 13 | ||||
-rw-r--r-- | examples/widgets/tablet/tabletapplication.cpp | 57 | ||||
-rw-r--r-- | examples/widgets/tablet/tabletapplication.h | 67 | ||||
-rw-r--r-- | examples/widgets/tablet/tabletcanvas.cpp | 257 | ||||
-rw-r--r-- | examples/widgets/tablet/tabletcanvas.h | 115 |
8 files changed, 959 insertions, 0 deletions
diff --git a/examples/widgets/tablet/main.cpp b/examples/widgets/tablet/main.cpp new file mode 100644 index 0000000..15043a6 --- /dev/null +++ b/examples/widgets/tablet/main.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> + +#include "mainwindow.h" +#include "tabletapplication.h" +#include "tabletcanvas.h" + +//! [0] +int main(int argv, char *args[]) +{ + TabletApplication app(argv, args); + TabletCanvas *canvas = new TabletCanvas; + app.setCanvas(canvas); + + MainWindow mainWindow(canvas); + mainWindow.resize(500, 500); + mainWindow.show(); + + return app.exec(); +} +//! [0] diff --git a/examples/widgets/tablet/mainwindow.cpp b/examples/widgets/tablet/mainwindow.cpp new file mode 100644 index 0000000..56a10cd --- /dev/null +++ b/examples/widgets/tablet/mainwindow.cpp @@ -0,0 +1,275 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> + +#include "mainwindow.h" +#include "tabletcanvas.h" + +//! [0] +MainWindow::MainWindow(TabletCanvas *canvas) +{ + myCanvas = canvas; + createActions(); + createMenus(); + + myCanvas->setColor(Qt::red); + myCanvas->setLineWidthType(TabletCanvas::LineWidthPressure); + myCanvas->setAlphaChannelType(TabletCanvas::NoAlpha); + myCanvas->setColorSaturationType(TabletCanvas::NoSaturation); + + setWindowTitle(tr("Tablet Example")); + setCentralWidget(myCanvas); +} +//! [0] + +//! [1] +void MainWindow::brushColorAct() +{ + QColor color = QColorDialog::getColor(myCanvas->color()); + + if (color.isValid()) + myCanvas->setColor(color); +} +//! [1] + +//! [2] +void MainWindow::alphaActionTriggered(QAction *action) +{ + if (action == alphaChannelPressureAction) { + myCanvas->setAlphaChannelType(TabletCanvas::AlphaPressure); + } else if (action == alphaChannelTiltAction) { + myCanvas->setAlphaChannelType(TabletCanvas::AlphaTilt); + } else { + myCanvas->setAlphaChannelType(TabletCanvas::NoAlpha); + } +} +//! [2] + +//! [3] +void MainWindow::lineWidthActionTriggered(QAction *action) +{ + if (action == lineWidthPressureAction) { + myCanvas->setLineWidthType(TabletCanvas::LineWidthPressure); + } else if (action == lineWidthTiltAction) { + myCanvas->setLineWidthType(TabletCanvas::LineWidthTilt); + } else { + myCanvas->setLineWidthType(TabletCanvas::NoLineWidth); + } +} +//! [3] + +//! [4] +void MainWindow::saturationActionTriggered(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); + } +} +//! [4] + +//! [5] +void MainWindow::saveAct() +{ + QString path = QDir::currentPath() + "/untitled.png"; + QString fileName = QFileDialog::getSaveFileName(this, tr("Save Picture"), + path); + + if (!myCanvas->saveImage(fileName)) + QMessageBox::information(this, "Error Saving Picture", + "Could not save the image"); +} +//! [5] + +//! [6] +void MainWindow::loadAct() +{ + QString fileName = QFileDialog::getOpenFileName(this, tr("Open Picture"), + QDir::currentPath()); + + if (!myCanvas->loadImage(fileName)) + QMessageBox::information(this, "Error Opening Picture", + "Could not open picture"); +} +//! [6] + +//! [7] +void MainWindow::aboutAct() +{ + QMessageBox::about(this, tr("About Tablet Example"), + tr("This example shows use of a Wacom tablet in Qt")); +} +//! [7] + +//! [8] +void MainWindow::createActions() +{ +//! [8] + brushColorAction = new QAction(tr("&Brush Color..."), this); + brushColorAction->setShortcut(tr("Ctrl+C")); + connect(brushColorAction, SIGNAL(triggered()), + this, SLOT(brushColorAct())); + +//! [9] + alphaChannelPressureAction = new QAction(tr("&Pressure"), this); + alphaChannelPressureAction->setCheckable(true); + + alphaChannelTiltAction = new QAction(tr("&Tilt"), this); + alphaChannelTiltAction->setCheckable(true); + + noAlphaChannelAction = new QAction(tr("No Alpha Channel"), this); + noAlphaChannelAction->setCheckable(true); + noAlphaChannelAction->setChecked(true); + + alphaChannelGroup = new QActionGroup(this); + alphaChannelGroup->addAction(alphaChannelPressureAction); + alphaChannelGroup->addAction(alphaChannelTiltAction); + alphaChannelGroup->addAction(noAlphaChannelAction); + connect(alphaChannelGroup, SIGNAL(triggered(QAction *)), + this, SLOT(alphaActionTriggered(QAction *))); + +//! [9] + colorSaturationVTiltAction = new QAction(tr("&Vertical Tilt"), this); + colorSaturationVTiltAction->setCheckable(true); + + colorSaturationHTiltAction = new QAction(tr("&Horizontal Tilt"), this); + colorSaturationHTiltAction->setCheckable(true); + + colorSaturationPressureAction = new QAction(tr("&Pressure"), this); + colorSaturationPressureAction->setCheckable(true); + + noColorSaturationAction = new QAction(tr("&No Color Saturation"), this); + noColorSaturationAction->setCheckable(true); + noColorSaturationAction->setChecked(true); + + 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->setShortcut(tr("Ctrl+X")); + connect(exitAction, SIGNAL(triggered()), + this, SLOT(close())); + + loadAction = new QAction(tr("&Open..."), this); + loadAction->setShortcut(tr("Ctrl+O")); + connect(loadAction, SIGNAL(triggered()), + this, SLOT(loadAct())); + + saveAction = new QAction(tr("&Save As..."), this); + saveAction->setShortcut(tr("Ctrl+S")); + 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(alphaChannelTiltAction); + alphaChannelMenu->addAction(noAlphaChannelAction); + + colorSaturationMenu = tabletMenu->addMenu(tr("&Color Saturation")); + colorSaturationMenu->addAction(colorSaturationVTiltAction); + colorSaturationMenu->addAction(colorSaturationHTiltAction); + colorSaturationMenu->addAction(noColorSaturationAction); + + helpMenu = menuBar()->addMenu("&Help"); + helpMenu->addAction(aboutAction); + helpMenu->addAction(aboutQtAction); +} +//! [11] diff --git a/examples/widgets/tablet/mainwindow.h b/examples/widgets/tablet/mainwindow.h new file mode 100644 index 0000000..85be425 --- /dev/null +++ b/examples/widgets/tablet/mainwindow.h @@ -0,0 +1,114 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include <QMainWindow> + +QT_BEGIN_NAMESPACE +class QAction; +class QActionGroup; +class QMenu; +class QStatusBar; +QT_END_NAMESPACE +class TabletCanvas; + +//! [0] +class MainWindow : public QMainWindow +{ + Q_OBJECT + +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(); + +private: + void createActions(); + void createMenus(); + + TabletCanvas *myCanvas; + + QAction *brushColorAction; + QActionGroup *brushActionGroup; + + QActionGroup *alphaChannelGroup; + QAction *alphaChannelPressureAction; + 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; +}; +//! [0] + +#endif diff --git a/examples/widgets/tablet/tablet.pro b/examples/widgets/tablet/tablet.pro new file mode 100644 index 0000000..27d8d2c --- /dev/null +++ b/examples/widgets/tablet/tablet.pro @@ -0,0 +1,13 @@ +HEADERS = mainwindow.h \ + tabletcanvas.h \ + tabletapplication.h +SOURCES = mainwindow.cpp \ + main.cpp \ + tabletcanvas.cpp \ + tabletapplication.cpp + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tablet +sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS tablet.pro +sources.path = $$[QT_INSTALL_EXAMPLES]/widgets/tablet +INSTALLS += target sources diff --git a/examples/widgets/tablet/tabletapplication.cpp b/examples/widgets/tablet/tabletapplication.cpp new file mode 100644 index 0000000..c318b85 --- /dev/null +++ b/examples/widgets/tablet/tabletapplication.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> + +#include "tabletapplication.h" + +//! [0] +bool TabletApplication::event(QEvent *event) +{ + if (event->type() == QEvent::TabletEnterProximity || + event->type() == QEvent::TabletLeaveProximity) { + myCanvas->setTabletDevice( + static_cast<QTabletEvent *>(event)->device()); + return true; + } + return QApplication::event(event); +} +//! [0] diff --git a/examples/widgets/tablet/tabletapplication.h b/examples/widgets/tablet/tabletapplication.h new file mode 100644 index 0000000..acbaa50 --- /dev/null +++ b/examples/widgets/tablet/tabletapplication.h @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TABLETAPPLICATION_H +#define TABLETAPPLICATION_H + +#include <QApplication> + +#include "tabletcanvas.h" + +//! [0] +class TabletApplication : public QApplication +{ + Q_OBJECT + +public: + TabletApplication(int &argv, char **args) + : QApplication(argv, args) {} + + bool event(QEvent *event); + void setCanvas(TabletCanvas *canvas) + { myCanvas = canvas; } + +private: + TabletCanvas *myCanvas; +}; +//! [0] + +#endif diff --git a/examples/widgets/tablet/tabletcanvas.cpp b/examples/widgets/tablet/tabletcanvas.cpp new file mode 100644 index 0000000..dc42c3c --- /dev/null +++ b/examples/widgets/tablet/tabletcanvas.cpp @@ -0,0 +1,257 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> +#include <math.h> + +#include "tabletcanvas.h" + +//! [0] +TabletCanvas::TabletCanvas() +{ + resize(500, 500); + myBrush = QBrush(); + myPen = QPen(); + initImage(); + setAutoFillBackground(true); + deviceDown = false; + myColor = Qt::red; + myTabletDevice = QTabletEvent::Stylus; + alphaChannelType = NoAlpha; + colorSaturationType = NoSaturation; + lineWidthType = LineWidthPressure; +} + +void TabletCanvas::initImage() +{ + QImage newImage = QImage(width(), height(), QImage::Format_ARGB32); + QPainter painter(&newImage); + painter.fillRect(0, 0, newImage.width(), newImage.height(), Qt::white); + if (!image.isNull()) + painter.drawImage(0, 0, image); + painter.end(); + image = newImage; +} +//! [0] + +//! [1] +bool TabletCanvas::saveImage(const QString &file) +{ + return image.save(file); +} +//! [1] + +//! [2] +bool TabletCanvas::loadImage(const QString &file) +{ + bool success = image.load(file); + + if (success) { + update(); + return true; + } + return false; +} +//! [2] + +//! [3] +void TabletCanvas::tabletEvent(QTabletEvent *event) +{ + + switch (event->type()) { + case QEvent::TabletPress: + if (!deviceDown) + deviceDown = true; + break; + case QEvent::TabletRelease: + if (deviceDown) + deviceDown = false; + break; + case QEvent::TabletMove: + polyLine[2] = polyLine[1]; + polyLine[1] = polyLine[0]; + polyLine[0] = event->pos(); + + if (deviceDown) { + updateBrush(event); + QPainter painter(&image); + paintImage(painter, event); + } + break; + default: + break; + } + update(); +} +//! [3] + +//! [4] +void TabletCanvas::paintEvent(QPaintEvent *) +{ + QPainter painter(this); + painter.drawImage(QPoint(0, 0), image); +} +//! [4] + +//! [5] +void TabletCanvas::paintImage(QPainter &painter, QTabletEvent *event) +{ + QPoint brushAdjust(10, 10); + + switch (myTabletDevice) { + case QTabletEvent::Stylus: + painter.setBrush(myBrush); + painter.setPen(myPen); + painter.drawLine(polyLine[1], event->pos()); + break; + case QTabletEvent::Airbrush: + myBrush.setColor(myColor); + myBrush.setStyle(brushPattern(event->pressure())); + painter.setPen(Qt::NoPen); + painter.setBrush(myBrush); + + for (int i = 0; i < 3; ++i) { + painter.drawEllipse(QRect(polyLine[i] - brushAdjust, + polyLine[i] + brushAdjust)); + } + break; + case QTabletEvent::Puck: + case QTabletEvent::FourDMouse: + case QTabletEvent::RotationStylus: + qWarning("This input device is not supported by the example."); + break; + default: + qWarning("Unknown tablet device."); + } +} +//! [5] + +//! [6] +Qt::BrushStyle TabletCanvas::brushPattern(qreal value) +{ + int pattern = int((value) * 100.0) % 7; + + switch (pattern) { + case 0: + return Qt::SolidPattern; + case 1: + return Qt::Dense1Pattern; + case 2: + return Qt::Dense2Pattern; + case 3: + return Qt::Dense3Pattern; + case 4: + return Qt::Dense4Pattern; + case 5: + return Qt::Dense5Pattern; + case 6: + return Qt::Dense6Pattern; + default: + return Qt::Dense7Pattern; + } +} +//! [6] + +//! [7] +void TabletCanvas::updateBrush(QTabletEvent *event) +{ + int hue, saturation, value, alpha; + myColor.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.setAlpha(int(event->pressure() * 255.0)); + break; + case AlphaTilt: + myColor.setAlpha(maximum(abs(vValue - 127), abs(hValue - 127))); + break; + default: + myColor.setAlpha(255); + } + +//! [8] //! [9] + switch (colorSaturationType) { + case SaturationVTilt: + myColor.setHsv(hue, vValue, value, alpha); + break; + case SaturationHTilt: + myColor.setHsv(hue, hValue, value, alpha); + break; + case SaturationPressure: + myColor.setHsv(hue, int(event->pressure() * 255.0), value, alpha); + break; + default: + ; + } + +//! [9] //! [10] + switch (lineWidthType) { + case LineWidthPressure: + myPen.setWidthF(event->pressure() * 10 + 1); + break; + case LineWidthTilt: + myPen.setWidthF(maximum(abs(vValue - 127), abs(hValue - 127)) / 12); + break; + default: + myPen.setWidthF(1); + } + +//! [10] //! [11] + if (event->pointerType() == QTabletEvent::Eraser) { + myBrush.setColor(Qt::white); + myPen.setColor(Qt::white); + myPen.setWidthF(event->pressure() * 10 + 1); + } else { + myBrush.setColor(myColor); + myPen.setColor(myColor); + } +} +//! [11] + +void TabletCanvas::resizeEvent(QResizeEvent *event) +{ + initImage(); + polyLine[0] = polyLine[1] = polyLine[2] = QPoint(); +} diff --git a/examples/widgets/tablet/tabletcanvas.h b/examples/widgets/tablet/tabletcanvas.h new file mode 100644 index 0000000..90eb1db --- /dev/null +++ b/examples/widgets/tablet/tabletcanvas.h @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TABLETCANVAS_H +#define TABLETCANVAS_H + +#include <QWidget> +#include <QImage> +#include <QPoint> +#include <QTabletEvent> +#include <QColor> +#include <QBrush> +#include <QPen> +#include <QPoint> + +QT_BEGIN_NAMESPACE +class QPaintEvent; +class QString; +QT_END_NAMESPACE + +//! [0] +class TabletCanvas : public QWidget +{ + Q_OBJECT + +public: + enum AlphaChannelType { AlphaPressure, AlphaTilt, NoAlpha }; + enum ColorSaturationType { SaturationVTilt, SaturationHTilt, + SaturationPressure, NoSaturation }; + enum LineWidthType { LineWidthPressure, LineWidthTilt, NoLineWidth }; + + 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; } + QColor color() const + { return myColor; } + void setTabletDevice(QTabletEvent::TabletDevice device) + { myTabletDevice = device; } + int maximum(int a, int b) + { return a > b ? a : b; } + +protected: + void tabletEvent(QTabletEvent *event); + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + +private: + void initImage(); + void paintImage(QPainter &painter, QTabletEvent *event); + Qt::BrushStyle brushPattern(qreal value); + void updateBrush(QTabletEvent *event); + + AlphaChannelType alphaChannelType; + ColorSaturationType colorSaturationType; + LineWidthType lineWidthType; + QTabletEvent::PointerType pointerType; + QTabletEvent::TabletDevice myTabletDevice; + QColor myColor; + + QImage image; + QBrush myBrush; + QPen myPen; + bool deviceDown; + QPoint polyLine[3]; +}; +//! [0] + +#endif |