|  | Home · All Classes · Main Classes · Grouped Classes · Modules · Functions |

# view.cpp Example File
demos/chip/view.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2005-2006 Trolltech ASA. All rights reserved.
    **
    ** This file is part of the demonstration applications of the Qt Toolkit.
    **
    ** Licensees holding valid Qt Preview licenses may use this file in
    ** accordance with the Qt Preview License Agreement provided with the
    ** Software.
    **
    ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
    ** information about Qt Commercial License Agreements.
    **
    ** Contact info@trolltech.com if any conditions of this licensing are
    ** not clear to you.
    **
    ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
    ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
    **
    ****************************************************************************/

    #include "view.h"

    #include <QtGui>
    #include <QtOpenGL>

    #include <math.h>

    View::View(const QString &name, QWidget *parent)
        : QFrame(parent)
    {
        setFrameStyle(Sunken | StyledPanel);
        graphicsView = new QGraphicsView;
        graphicsView->setRenderHint(QPainter::Antialiasing, false);
        graphicsView->setDragMode(QGraphicsView::RubberBandDrag);

        int size = style()->pixelMetric(QStyle::PM_ToolBarIconSize);
        QSize iconSize(size, size);

        QToolButton *zoomInIcon = new QToolButton;
        zoomInIcon->setAutoRepeat(true);
        zoomInIcon->setAutoRepeatInterval(33);
        zoomInIcon->setAutoRepeatDelay(0);
        zoomInIcon->setIcon(QPixmap(":/zoomin.png"));
        zoomInIcon->setIconSize(iconSize);
        QToolButton *zoomOutIcon = new QToolButton;
        zoomOutIcon->setAutoRepeat(true);
        zoomOutIcon->setAutoRepeatInterval(33);
        zoomOutIcon->setAutoRepeatDelay(0);
        zoomOutIcon->setIcon(QPixmap(":/zoomout.png"));
        zoomOutIcon->setIconSize(iconSize);
        zoomSlider = new QSlider;
        zoomSlider->setMinimum(0);
        zoomSlider->setMaximum(500);
        zoomSlider->setValue(250);
        zoomSlider->setTickPosition(QSlider::TicksRight);

        // Zoom slider layout
        QVBoxLayout *zoomSliderLayout = new QVBoxLayout;
        zoomSliderLayout->addWidget(zoomInIcon);
        zoomSliderLayout->addWidget(zoomSlider);
        zoomSliderLayout->addWidget(zoomOutIcon);

        QToolButton *rotateLeftIcon = new QToolButton;
        rotateLeftIcon->setIcon(QPixmap(":/rotateleft.png"));
        rotateLeftIcon->setIconSize(iconSize);
        QToolButton *rotateRightIcon = new QToolButton;
        rotateRightIcon->setIcon(QPixmap(":/rotateright.png"));
        rotateRightIcon->setIconSize(iconSize);
        rotateSlider = new QSlider;
        rotateSlider->setOrientation(Qt::Horizontal);
        rotateSlider->setMinimum(-360);
        rotateSlider->setMaximum(360);
        rotateSlider->setValue(0);
        rotateSlider->setTickPosition(QSlider::TicksBelow);

        // Rotate slider layout
        QHBoxLayout *rotateSliderLayout = new QHBoxLayout;
        rotateSliderLayout->addWidget(rotateLeftIcon);
        rotateSliderLayout->addWidget(rotateSlider);
        rotateSliderLayout->addWidget(rotateRightIcon);

        resetButton = new QToolButton;
        resetButton->setText(tr("0"));
        resetButton->setEnabled(false);

        // Label layout
        QHBoxLayout *labelLayout = new QHBoxLayout;
        label = new QLabel(name);
        antialiasButton = new QToolButton;
        antialiasButton->setText(tr("Antialiasing"));
        antialiasButton->setCheckable(true);
        antialiasButton->setChecked(false);
        openGlButton = new QToolButton;
        openGlButton->setText(tr("OpenGL"));
        openGlButton->setCheckable(true);
        openGlButton->setEnabled(QGLFormat::hasOpenGL());
        printButton = new QToolButton;
        printButton->setIcon(QIcon(QPixmap(":/fileprint.png")));

        labelLayout->addWidget(label);
        labelLayout->addStretch();
        labelLayout->addWidget(antialiasButton);
        labelLayout->addWidget(openGlButton);
        labelLayout->addWidget(printButton);

        QGridLayout *topLayout = new QGridLayout;
        topLayout->addLayout(labelLayout, 0, 0);
        topLayout->addWidget(graphicsView, 1, 0);
        topLayout->addLayout(zoomSliderLayout, 1, 1);
        topLayout->addLayout(rotateSliderLayout, 2, 0);
        topLayout->addWidget(resetButton, 2, 1);
        setLayout(topLayout);

        connect(resetButton, SIGNAL(clicked()), this, SLOT(resetView()));
        connect(zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix()));
        connect(rotateSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix()));
        connect(graphicsView->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setResetButtonEnabled()));
        connect(graphicsView->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setResetButtonEnabled()));
        connect(antialiasButton, SIGNAL(toggled(bool)), this, SLOT(toggleAntialiasing()));
        connect(openGlButton, SIGNAL(toggled(bool)), this, SLOT(toggleOpenGL()));
        connect(rotateLeftIcon, SIGNAL(clicked()), this, SLOT(rotateLeft()));
        connect(rotateRightIcon, SIGNAL(clicked()), this, SLOT(rotateRight()));
        connect(zoomInIcon, SIGNAL(clicked()), this, SLOT(zoomIn()));
        connect(zoomOutIcon, SIGNAL(clicked()), this, SLOT(zoomOut()));
        connect(printButton, SIGNAL(clicked()), this, SLOT(print()));

        setupMatrix();
    }

    QGraphicsView *View::view() const
    {
        return graphicsView;
    }

    void View::resetView()
    {
        zoomSlider->setValue(5);
        rotateSlider->setValue(0);
        setupMatrix();
        graphicsView->ensureVisible(QRectF(0, 0, 0, 0));

        resetButton->setEnabled(false);
    }

    void View::setResetButtonEnabled()
    {
        resetButton->setEnabled(true);
    }

    void View::setupMatrix()
    {
        qreal scale = ::pow(2.0, (zoomSlider->value() - 250) / 50.0);

        QMatrix matrix;
        matrix.scale(scale, scale);
        matrix.rotate(rotateSlider->value());

        graphicsView->setMatrix(matrix);
        setResetButtonEnabled();
    }

    void View::toggleOpenGL()
    {
        graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget);
    }

    void View::toggleAntialiasing()
    {
        graphicsView->setRenderHint(QPainter::Antialiasing, antialiasButton->isChecked());
    }

    void View::print()
    {
        QPrinter printer;
        QPrintDialog dialog(&printer, this);
        if (dialog.exec() == QDialog::Accepted) {
            QPainter painter(&printer);
            graphicsView->render(&painter);
        }
    }

    void View::zoomIn()
    {
        zoomSlider->setValue(zoomSlider->value() + 1);
    }

    void View::zoomOut()
    {
        zoomSlider->setValue(zoomSlider->value() - 1);
    }

    void View::rotateLeft()
    {
        rotateSlider->setValue(rotateSlider->value() - 10);
    }

    void View::rotateRight()
    {
        rotateSlider->setValue(rotateSlider->value() + 10);
    }