Mega Code Archive

 
Categories / C++ / Qt
 

Basic drawing

/**************************************************************************** ** ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial Usage ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Nokia. ** ** 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.1, 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 have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef RENDERAREA_H #define RENDERAREA_H #include <QBrush> #include <QPen> #include <QPixmap> #include <QWidget> class RenderArea : public QWidget {     Q_OBJECT public:     enum Shape { Line, Points, Polyline, Polygon, Rect, RoundedRect, Ellipse, Arc,                  Chord, Pie, Path, Text, Pixmap };     RenderArea(QWidget *parent = 0);     QSize minimumSizeHint() const;     QSize sizeHint() const; public slots:     void setShape(Shape shape);     void setPen(const QPen &pen);     void setBrush(const QBrush &brush);     void setAntialiased(bool antialiased);     void setTransformed(bool transformed); protected:     void paintEvent(QPaintEvent *event); private:     Shape shape;     QPen pen;     QBrush brush;     bool antialiased;     bool transformed;     QPixmap pixmap; }; #endif #include <QtGui> #include "renderarea.h" RenderArea::RenderArea(QWidget *parent)     : QWidget(parent) {     shape = Polygon;     antialiased = false;     transformed = false;     pixmap.load(":/images/qt-logo.png");     setBackgroundRole(QPalette::Base);     setAutoFillBackground(true); } QSize RenderArea::minimumSizeHint() const {     return QSize(100, 100); } QSize RenderArea::sizeHint() const {     return QSize(400, 200); } void RenderArea::setShape(Shape shape) {     this->shape = shape;     update(); } void RenderArea::setPen(const QPen &pen) {     this->pen = pen;     update(); } void RenderArea::setBrush(const QBrush &brush) {     this->brush = brush;     update(); } void RenderArea::setAntialiased(bool antialiased) {     this->antialiased = antialiased;     update(); } void RenderArea::setTransformed(bool transformed) {     this->transformed = transformed;     update(); } void RenderArea::paintEvent(QPaintEvent * /* event */) {     static const QPoint points[4] = {         QPoint(10, 80),         QPoint(20, 10),         QPoint(80, 30),         QPoint(90, 70)     };     QRect rect(10, 20, 80, 60);     QPainterPath path;     path.moveTo(20, 80);     path.lineTo(20, 30);     path.cubicTo(80, 0, 50, 50, 80, 80);     int startAngle = 20 * 16;     int arcLength = 120 * 16;     QPainter painter(this);     painter.setPen(pen);     painter.setBrush(brush);     if (antialiased) {         painter.setRenderHint(QPainter::Antialiasing, true);         painter.translate(+0.5, +0.5);     }     for (int x = 0; x < width(); x += 100) {         for (int y = 0; y < height(); y += 100) {             painter.save();             painter.translate(x, y);               if (transformed) {                 painter.translate(50, 50);                 painter.rotate(60.0);                 painter.scale(0.6, 0.9);                 painter.translate(-50, -50);             }             switch (shape) {             case Line:                 painter.drawLine(rect.bottomLeft(), rect.topRight());                 break;             case Points:                 painter.drawPoints(points, 4);                 break;             case Polyline:                 painter.drawPolyline(points, 4);                 break;             case Polygon:                 painter.drawPolygon(points, 4);                 break;             case Rect:                 painter.drawRect(rect);                 break;             case RoundedRect:                 painter.drawRoundedRect(rect, 25, 25, Qt::RelativeSize);                 break;             case Ellipse:                 painter.drawEllipse(rect);                 break;             case Arc:                 painter.drawArc(rect, startAngle, arcLength);                 break;             case Chord:                 painter.drawChord(rect, startAngle, arcLength);                 break;             case Pie:                 painter.drawPie(rect, startAngle, arcLength);                 break;             case Path:                 painter.drawPath(path);                 break;             case Text:                 painter.drawText(rect, Qt::AlignCenter, tr("Qt by\nNokia"));                 break;             case Pixmap:                 painter.drawPixmap(10, 10, pixmap);             }               painter.restore();         }     }     painter.setPen(palette().dark().color());     painter.setBrush(Qt::NoBrush);     painter.drawRect(QRect(0, 0, width() - 1, height() - 1)); } #ifndef WINDOW_H #define WINDOW_H #include <QWidget> QT_BEGIN_NAMESPACE class QCheckBox; class QComboBox; class QLabel; class QSpinBox; QT_END_NAMESPACE class RenderArea; class Window : public QWidget {     Q_OBJECT public:     Window(); private slots:     void shapeChanged();     void penChanged();     void brushChanged(); private:     RenderArea *renderArea;     QLabel *shapeLabel;     QLabel *penWidthLabel;     QLabel *penStyleLabel;     QLabel *penCapLabel;     QLabel *penJoinLabel;     QLabel *brushStyleLabel;     QLabel *otherOptionsLabel;     QComboBox *shapeComboBox;     QSpinBox *penWidthSpinBox;     QComboBox *penStyleComboBox;     QComboBox *penCapComboBox;     QComboBox *penJoinComboBox;     QComboBox *brushStyleComboBox;     QCheckBox *antialiasingCheckBox;     QCheckBox *transformationsCheckBox; }; #endif #include <QtGui> #include "renderarea.h" #include "window.h" const int IdRole = Qt::UserRole; Window::Window() {     renderArea = new RenderArea;     shapeComboBox = new QComboBox;     shapeComboBox->addItem(tr("Polygon"), RenderArea::Polygon);     shapeComboBox->addItem(tr("Rectangle"), RenderArea::Rect);     shapeComboBox->addItem(tr("Rounded Rectangle"), RenderArea::RoundedRect);     shapeComboBox->addItem(tr("Ellipse"), RenderArea::Ellipse);     shapeComboBox->addItem(tr("Pie"), RenderArea::Pie);     shapeComboBox->addItem(tr("Chord"), RenderArea::Chord);     shapeComboBox->addItem(tr("Path"), RenderArea::Path);     shapeComboBox->addItem(tr("Line"), RenderArea::Line);     shapeComboBox->addItem(tr("Polyline"), RenderArea::Polyline);     shapeComboBox->addItem(tr("Arc"), RenderArea::Arc);     shapeComboBox->addItem(tr("Points"), RenderArea::Points);     shapeComboBox->addItem(tr("Text"), RenderArea::Text);     shapeComboBox->addItem(tr("Pixmap"), RenderArea::Pixmap);     shapeLabel = new QLabel(tr("&Shape:"));     shapeLabel->setBuddy(shapeComboBox);     penWidthSpinBox = new QSpinBox;     penWidthSpinBox->setRange(0, 20);     penWidthSpinBox->setSpecialValueText(tr("0 (cosmetic pen)"));     penWidthLabel = new QLabel(tr("Pen &Width:"));     penWidthLabel->setBuddy(penWidthSpinBox);     penStyleComboBox = new QComboBox;     penStyleComboBox->addItem(tr("Solid"), Qt::SolidLine);     penStyleComboBox->addItem(tr("Dash"), Qt::DashLine);     penStyleComboBox->addItem(tr("Dot"), Qt::DotLine);     penStyleComboBox->addItem(tr("Dash Dot"), Qt::DashDotLine);     penStyleComboBox->addItem(tr("Dash Dot Dot"), Qt::DashDotDotLine);     penStyleComboBox->addItem(tr("None"), Qt::NoPen);     penStyleLabel = new QLabel(tr("&Pen Style:"));     penStyleLabel->setBuddy(penStyleComboBox);     penCapComboBox = new QComboBox;     penCapComboBox->addItem(tr("Flat"), Qt::FlatCap);     penCapComboBox->addItem(tr("Square"), Qt::SquareCap);     penCapComboBox->addItem(tr("Round"), Qt::RoundCap);     penCapLabel = new QLabel(tr("Pen &Cap:"));     penCapLabel->setBuddy(penCapComboBox);     penJoinComboBox = new QComboBox;     penJoinComboBox->addItem(tr("Miter"), Qt::MiterJoin);     penJoinComboBox->addItem(tr("Bevel"), Qt::BevelJoin);     penJoinComboBox->addItem(tr("Round"), Qt::RoundJoin);     penJoinLabel = new QLabel(tr("Pen &Join:"));     penJoinLabel->setBuddy(penJoinComboBox);     brushStyleComboBox = new QComboBox;     brushStyleComboBox->addItem(tr("Linear Gradient"),             Qt::LinearGradientPattern);     brushStyleComboBox->addItem(tr("Radial Gradient"),             Qt::RadialGradientPattern);     brushStyleComboBox->addItem(tr("Conical Gradient"),             Qt::ConicalGradientPattern);     brushStyleComboBox->addItem(tr("Texture"), Qt::TexturePattern);     brushStyleComboBox->addItem(tr("Solid"), Qt::SolidPattern);     brushStyleComboBox->addItem(tr("Horizontal"), Qt::HorPattern);     brushStyleComboBox->addItem(tr("Vertical"), Qt::VerPattern);     brushStyleComboBox->addItem(tr("Cross"), Qt::CrossPattern);     brushStyleComboBox->addItem(tr("Backward Diagonal"), Qt::BDiagPattern);     brushStyleComboBox->addItem(tr("Forward Diagonal"), Qt::FDiagPattern);     brushStyleComboBox->addItem(tr("Diagonal Cross"), Qt::DiagCrossPattern);     brushStyleComboBox->addItem(tr("Dense 1"), Qt::Dense1Pattern);     brushStyleComboBox->addItem(tr("Dense 2"), Qt::Dense2Pattern);     brushStyleComboBox->addItem(tr("Dense 3"), Qt::Dense3Pattern);     brushStyleComboBox->addItem(tr("Dense 4"), Qt::Dense4Pattern);     brushStyleComboBox->addItem(tr("Dense 5"), Qt::Dense5Pattern);     brushStyleComboBox->addItem(tr("Dense 6"), Qt::Dense6Pattern);     brushStyleComboBox->addItem(tr("Dense 7"), Qt::Dense7Pattern);     brushStyleComboBox->addItem(tr("None"), Qt::NoBrush);     brushStyleLabel = new QLabel(tr("&Brush Style:"));     brushStyleLabel->setBuddy(brushStyleComboBox);     otherOptionsLabel = new QLabel(tr("Other Options:"));       antialiasingCheckBox = new QCheckBox(tr("&Antialiasing"));       transformationsCheckBox = new QCheckBox(tr("&Transformations"));     connect(shapeComboBox, SIGNAL(activated(int)),             this, SLOT(shapeChanged()));     connect(penWidthSpinBox, SIGNAL(valueChanged(int)),             this, SLOT(penChanged()));     connect(penStyleComboBox, SIGNAL(activated(int)),             this, SLOT(penChanged()));     connect(penCapComboBox, SIGNAL(activated(int)),             this, SLOT(penChanged()));     connect(penJoinComboBox, SIGNAL(activated(int)),             this, SLOT(penChanged()));     connect(brushStyleComboBox, SIGNAL(activated(int)),             this, SLOT(brushChanged()));     connect(antialiasingCheckBox, SIGNAL(toggled(bool)),             renderArea, SLOT(setAntialiased(bool)));     connect(transformationsCheckBox, SIGNAL(toggled(bool)),             renderArea, SLOT(setTransformed(bool)));     QGridLayout *mainLayout = new QGridLayout;       mainLayout->setColumnStretch(0, 1);     mainLayout->setColumnStretch(3, 1);     mainLayout->addWidget(renderArea, 0, 0, 1, 4);     mainLayout->setRowMinimumHeight(1, 6);     mainLayout->addWidget(shapeLabel, 2, 1, Qt::AlignRight);     mainLayout->addWidget(shapeComboBox, 2, 2);     mainLayout->addWidget(penWidthLabel, 3, 1, Qt::AlignRight);     mainLayout->addWidget(penWidthSpinBox, 3, 2);     mainLayout->addWidget(penStyleLabel, 4, 1, Qt::AlignRight);     mainLayout->addWidget(penStyleComboBox, 4, 2);     mainLayout->addWidget(penCapLabel, 5, 1, Qt::AlignRight);     mainLayout->addWidget(penCapComboBox, 5, 2);     mainLayout->addWidget(penJoinLabel, 6, 1, Qt::AlignRight);     mainLayout->addWidget(penJoinComboBox, 6, 2);     mainLayout->addWidget(brushStyleLabel, 7, 1, Qt::AlignRight);     mainLayout->addWidget(brushStyleComboBox, 7, 2);     mainLayout->setRowMinimumHeight(8, 6);     mainLayout->addWidget(otherOptionsLabel, 9, 1, Qt::AlignRight);     mainLayout->addWidget(antialiasingCheckBox, 9, 2);     mainLayout->addWidget(transformationsCheckBox, 10, 2);     setLayout(mainLayout);     shapeChanged();     penChanged();     brushChanged();     antialiasingCheckBox->setChecked(true);     setWindowTitle(tr("Basic Drawing")); } void Window::shapeChanged() {     RenderArea::Shape shape = RenderArea::Shape(shapeComboBox->itemData(             shapeComboBox->currentIndex(), IdRole).toInt());     renderArea->setShape(shape); } void Window::penChanged() {     int width = penWidthSpinBox->value();     Qt::PenStyle style = Qt::PenStyle(penStyleComboBox->itemData(             penStyleComboBox->currentIndex(), IdRole).toInt());     Qt::PenCapStyle cap = Qt::PenCapStyle(penCapComboBox->itemData(             penCapComboBox->currentIndex(), IdRole).toInt());     Qt::PenJoinStyle join = Qt::PenJoinStyle(penJoinComboBox->itemData(             penJoinComboBox->currentIndex(), IdRole).toInt());     renderArea->setPen(QPen(Qt::blue, width, style, cap, join)); } void Window::brushChanged() {     Qt::BrushStyle style = Qt::BrushStyle(brushStyleComboBox->itemData(             brushStyleComboBox->currentIndex(), IdRole).toInt());     if (style == Qt::LinearGradientPattern) {         QLinearGradient linearGradient(0, 0, 100, 100);         linearGradient.setColorAt(0.0, Qt::white);         linearGradient.setColorAt(0.2, Qt::green);         linearGradient.setColorAt(1.0, Qt::black);         renderArea->setBrush(linearGradient);       } else if (style == Qt::RadialGradientPattern) {         QRadialGradient radialGradient(50, 50, 50, 70, 70);         radialGradient.setColorAt(0.0, Qt::white);         radialGradient.setColorAt(0.2, Qt::green);         radialGradient.setColorAt(1.0, Qt::black);         renderArea->setBrush(radialGradient);     } else if (style == Qt::ConicalGradientPattern) {         QConicalGradient conicalGradient(50, 50, 150);         conicalGradient.setColorAt(0.0, Qt::white);         conicalGradient.setColorAt(0.2, Qt::green);         conicalGradient.setColorAt(1.0, Qt::black);         renderArea->setBrush(conicalGradient);       } else if (style == Qt::TexturePattern) {         renderArea->setBrush(QBrush(QPixmap(":/images/brick.png")));       } else {         renderArea->setBrush(QBrush(Qt::green, style));     } } #include <QApplication> #include "window.h" int main(int argc, char *argv[]) {     Q_INIT_RESOURCE(basicdrawing);     QApplication app(argc, argv);     Window window;     window.show();     return app.exec(); }