Mega Code Archive

 
Categories / C++ / Qt
 

Image viewer

/**************************************************************************** ** ** 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 IMAGEVIEWER_H #define IMAGEVIEWER_H #include <QMainWindow> #include <QPrinter> QT_BEGIN_NAMESPACE class QAction; class QLabel; class QMenu; class QScrollArea; class QScrollBar; QT_END_NAMESPACE class ImageViewer : public QMainWindow {     Q_OBJECT public:     ImageViewer(); private slots:     void open();     void print();     void zoomIn();     void zoomOut();     void normalSize();     void fitToWindow();     void about(); private:     void createActions();     void createMenus();     void updateActions();     void scaleImage(double factor);     void adjustScrollBar(QScrollBar *scrollBar, double factor);     QLabel *imageLabel;     QScrollArea *scrollArea;     double scaleFactor; #ifndef QT_NO_PRINTER     QPrinter printer; #endif     QAction *openAct;     QAction *printAct;     QAction *exitAct;     QAction *zoomInAct;     QAction *zoomOutAct;     QAction *normalSizeAct;     QAction *fitToWindowAct;     QAction *aboutAct;     QAction *aboutQtAct;     QMenu *fileMenu;     QMenu *viewMenu;     QMenu *helpMenu; }; #endif #include <QtGui> #include "imageviewer.h" ImageViewer::ImageViewer() {     imageLabel = new QLabel;     imageLabel->setBackgroundRole(QPalette::Base);     imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);     imageLabel->setScaledContents(true);     scrollArea = new QScrollArea;     scrollArea->setBackgroundRole(QPalette::Dark);     scrollArea->setWidget(imageLabel);     setCentralWidget(scrollArea);     createActions();     createMenus();     setWindowTitle(tr("Image Viewer"));     resize(500, 400); } void ImageViewer::open()   {     QString fileName = QFileDialog::getOpenFileName(this,                                     tr("Open File"), QDir::currentPath());     if (!fileName.isEmpty()) {         QImage image(fileName);         if (image.isNull()) {             QMessageBox::information(this, tr("Image Viewer"),                                      tr("Cannot load %1.").arg(fileName));             return;         }           imageLabel->setPixmap(QPixmap::fromImage(image));           scaleFactor = 1.0;         printAct->setEnabled(true);         fitToWindowAct->setEnabled(true);         updateActions();         if (!fitToWindowAct->isChecked())             imageLabel->adjustSize();     } } void ImageViewer::print()   {     Q_ASSERT(imageLabel->pixmap()); #ifndef QT_NO_PRINTER       QPrintDialog dialog(&printer, this);       if (dialog.exec()) {         QPainter painter(&printer);         QRect rect = painter.viewport();         QSize size = imageLabel->pixmap()->size();         size.scale(rect.size(), Qt::KeepAspectRatio);         painter.setViewport(rect.x(), rect.y(), size.width(), size.height());         painter.setWindow(imageLabel->pixmap()->rect());         painter.drawPixmap(0, 0, *imageLabel->pixmap());     } #endif } void ImageViewer::zoomIn()   {     scaleImage(1.25); } void ImageViewer::zoomOut() {     scaleImage(0.8); }   void ImageViewer::normalSize()   {     imageLabel->adjustSize();     scaleFactor = 1.0; } void ImageViewer::fitToWindow()   {     bool fitToWindow = fitToWindowAct->isChecked();     scrollArea->setWidgetResizable(fitToWindow);     if (!fitToWindow) {         normalSize();     }     updateActions(); } void ImageViewer::about()   {     QMessageBox::about(this, tr("About Image Viewer"),             tr("<p>The <b>Image Viewer</b> example shows how to combine QLabel "                "and QScrollArea to display an image. QLabel is typically used "                "for displaying a text, but it can also display an image. "                "QScrollArea provides a scrolling view around another widget. "                "If the child widget exceeds the size of the frame, QScrollArea "                "automatically provides scroll bars. </p><p>The example "                "demonstrates how QLabel's ability to scale its contents "                "(QLabel::scaledContents), and QScrollArea's ability to "                "automatically resize its contents "                "(QScrollArea::widgetResizable), can be used to implement "                "zooming and scaling features. </p><p>In addition the example "                "shows how to use QPainter to print an image.</p>")); } void ImageViewer::createActions()   {     openAct = new QAction(tr("&Open..."), this);     openAct->setShortcut(tr("Ctrl+O"));     connect(openAct, SIGNAL(triggered()), this, SLOT(open()));     printAct = new QAction(tr("&Print..."), this);     printAct->setShortcut(tr("Ctrl+P"));     printAct->setEnabled(false);     connect(printAct, SIGNAL(triggered()), this, SLOT(print()));     exitAct = new QAction(tr("E&xit"), this);     exitAct->setShortcut(tr("Ctrl+Q"));     connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));     zoomInAct = new QAction(tr("Zoom &In (25%)"), this);     zoomInAct->setShortcut(tr("Ctrl++"));     zoomInAct->setEnabled(false);     connect(zoomInAct, SIGNAL(triggered()), this, SLOT(zoomIn()));     zoomOutAct = new QAction(tr("Zoom &Out (25%)"), this);     zoomOutAct->setShortcut(tr("Ctrl+-"));     zoomOutAct->setEnabled(false);     connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(zoomOut()));     normalSizeAct = new QAction(tr("&Normal Size"), this);     normalSizeAct->setShortcut(tr("Ctrl+S"));     normalSizeAct->setEnabled(false);     connect(normalSizeAct, SIGNAL(triggered()), this, SLOT(normalSize()));     fitToWindowAct = new QAction(tr("&Fit to Window"), this);     fitToWindowAct->setEnabled(false);     fitToWindowAct->setCheckable(true);     fitToWindowAct->setShortcut(tr("Ctrl+F"));     connect(fitToWindowAct, SIGNAL(triggered()), this, SLOT(fitToWindow()));     aboutAct = new QAction(tr("&About"), this);     connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));     aboutQtAct = new QAction(tr("About &Qt"), this);     connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); } void ImageViewer::createMenus()   {     fileMenu = new QMenu(tr("&File"), this);     fileMenu->addAction(openAct);     fileMenu->addAction(printAct);     fileMenu->addSeparator();     fileMenu->addAction(exitAct);     viewMenu = new QMenu(tr("&View"), this);     viewMenu->addAction(zoomInAct);     viewMenu->addAction(zoomOutAct);     viewMenu->addAction(normalSizeAct);     viewMenu->addSeparator();     viewMenu->addAction(fitToWindowAct);     helpMenu = new QMenu(tr("&Help"), this);     helpMenu->addAction(aboutAct);     helpMenu->addAction(aboutQtAct);     menuBar()->addMenu(fileMenu);     menuBar()->addMenu(viewMenu);     menuBar()->addMenu(helpMenu); } void ImageViewer::updateActions()   {     zoomInAct->setEnabled(!fitToWindowAct->isChecked());     zoomOutAct->setEnabled(!fitToWindowAct->isChecked());     normalSizeAct->setEnabled(!fitToWindowAct->isChecked()); } void ImageViewer::scaleImage(double factor)   {     Q_ASSERT(imageLabel->pixmap());     scaleFactor *= factor;     imageLabel->resize(scaleFactor * imageLabel->pixmap()->size());     adjustScrollBar(scrollArea->horizontalScrollBar(), factor);     adjustScrollBar(scrollArea->verticalScrollBar(), factor);     zoomInAct->setEnabled(scaleFactor < 3.0);     zoomOutAct->setEnabled(scaleFactor > 0.333); } void ImageViewer::adjustScrollBar(QScrollBar *scrollBar, double factor)   {     scrollBar->setValue(int(factor * scrollBar->value()                             + ((factor - 1) * scrollBar->pageStep()/2))); } #include <QApplication> #include "imageviewer.h" int main(int argc, char *argv[]) {     QApplication app(argc, argv);     ImageViewer imageViewer;     imageViewer.show();     return app.exec(); }