diff options
Diffstat (limited to 'examples/widgets/widgets/imageviewer/imageviewer.cpp')
-rw-r--r-- | examples/widgets/widgets/imageviewer/imageviewer.cpp | 214 |
1 files changed, 142 insertions, 72 deletions
diff --git a/examples/widgets/widgets/imageviewer/imageviewer.cpp b/examples/widgets/widgets/imageviewer/imageviewer.cpp index 93b88e9c18..a4b37060f6 100644 --- a/examples/widgets/widgets/imageviewer/imageviewer.cpp +++ b/examples/widgets/widgets/imageviewer/imageviewer.cpp @@ -47,19 +47,20 @@ //! [0] ImageViewer::ImageViewer() + : imageLabel(new QLabel) + , scrollArea(new QScrollArea) + , scaleFactor(1) { - 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); + scrollArea->setVisible(false); setCentralWidget(scrollArea); createActions(); - createMenus(); resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5); } @@ -71,53 +72,99 @@ bool ImageViewer::loadFile(const QString &fileName) { QImageReader reader(fileName); reader.setAutoTransform(true); - const QImage image = reader.read(); - if (image.isNull()) { + const QImage newImage = reader.read(); + if (newImage.isNull()) { QMessageBox::information(this, QGuiApplication::applicationDisplayName(), - tr("Cannot load %1.").arg(QDir::toNativeSeparators(fileName))); - setWindowFilePath(QString()); - imageLabel->setPixmap(QPixmap()); - imageLabel->adjustSize(); + tr("Cannot load %1: %2") + .arg(QDir::toNativeSeparators(fileName)), reader.errorString()); return false; } -//! [2] //! [3] +//! [2] + + setImage(newImage); + + setWindowFilePath(fileName); + + const QString message = tr("Opened \"%1\", %2x%3, Depth: %4") + .arg(QDir::toNativeSeparators(fileName)).arg(image.width()).arg(image.height()).arg(image.depth()); + statusBar()->showMessage(message); + return true; +} + +void ImageViewer::setImage(const QImage &newImage) +{ + image = newImage; imageLabel->setPixmap(QPixmap::fromImage(image)); -//! [3] //! [4] +//! [4] scaleFactor = 1.0; + scrollArea->setVisible(true); printAct->setEnabled(true); fitToWindowAct->setEnabled(true); updateActions(); if (!fitToWindowAct->isChecked()) imageLabel->adjustSize(); - - setWindowFilePath(fileName); - return true; } //! [4] -//! [2] +bool ImageViewer::saveFile(const QString &fileName) +{ + QImageWriter writer(fileName); + + if (!writer.write(image)) { + QMessageBox::information(this, QGuiApplication::applicationDisplayName(), + tr("Cannot write %1: %2") + .arg(QDir::toNativeSeparators(fileName)), writer.errorString()); + return false; + } + const QString message = tr("Wrote \"%1\"").arg(QDir::toNativeSeparators(fileName)); + statusBar()->showMessage(message); + return true; +} //! [1] -void ImageViewer::open() + +static void initializeImageFileDialog(QFileDialog &dialog, QFileDialog::AcceptMode acceptMode) { + static bool firstDialog = true; + + if (firstDialog) { + firstDialog = false; + const QStringList picturesLocations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation); + dialog.setDirectory(picturesLocations.isEmpty() ? QDir::currentPath() : picturesLocations.last()); + } + QStringList mimeTypeFilters; - foreach (const QByteArray &mimeTypeName, QImageReader::supportedMimeTypes()) + const QByteArrayList supportedMimeTypes = acceptMode == QFileDialog::AcceptOpen + ? QImageReader::supportedMimeTypes() : QImageWriter::supportedMimeTypes(); + foreach (const QByteArray &mimeTypeName, supportedMimeTypes) mimeTypeFilters.append(mimeTypeName); mimeTypeFilters.sort(); - const QStringList picturesLocations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation); - QFileDialog dialog(this, tr("Open File"), - picturesLocations.isEmpty() ? QDir::currentPath() : picturesLocations.last()); - dialog.setAcceptMode(QFileDialog::AcceptOpen); dialog.setMimeTypeFilters(mimeTypeFilters); dialog.selectMimeTypeFilter("image/jpeg"); + if (acceptMode == QFileDialog::AcceptSave) + dialog.setDefaultSuffix("jpg"); +} + +void ImageViewer::open() +{ + QFileDialog dialog(this, tr("Open File")); + initializeImageFileDialog(dialog, QFileDialog::AcceptOpen); while (dialog.exec() == QDialog::Accepted && !loadFile(dialog.selectedFiles().first())) {} } //! [1] +void ImageViewer::saveAs() +{ + QFileDialog dialog(this, tr("Save File As")); + initializeImageFileDialog(dialog, QFileDialog::AcceptSave); + + while (dialog.exec() == QDialog::Accepted && !saveFile(dialog.selectedFiles().first())) {} +} + //! [5] void ImageViewer::print() //! [5] //! [6] @@ -140,6 +187,43 @@ void ImageViewer::print() } //! [8] +void ImageViewer::copy() +{ +#ifndef QT_NO_CLIPBOARD + QGuiApplication::clipboard()->setImage(image); +#endif // !QT_NO_CLIPBOARD +} + +#ifndef QT_NO_CLIPBOARD +static QImage clipboardImage() +{ + if (const QMimeData *mimeData = QGuiApplication::clipboard()->mimeData()) { + if (mimeData->hasImage()) { + const QImage image = qvariant_cast<QImage>(mimeData->imageData()); + if (!image.isNull()) + return image; + } + } + return QImage(); +} +#endif // !QT_NO_CLIPBOARD + +void ImageViewer::paste() +{ +#ifndef QT_NO_CLIPBOARD + const QImage newImage = clipboardImage(); + if (newImage.isNull()) { + statusBar()->showMessage(tr("No image in clipboard")); + } else { + setImage(newImage); + setWindowFilePath(QString()); + const QString message = tr("Obtained image from clipboard, %1x%2, Depth: %3") + .arg(newImage.width()).arg(newImage.height()).arg(newImage.depth()); + statusBar()->showMessage(message); + } +#endif // !QT_NO_CLIPBOARD +} + //! [9] void ImageViewer::zoomIn() //! [9] //! [10] @@ -167,9 +251,8 @@ void ImageViewer::fitToWindow() { bool fitToWindow = fitToWindowAct->isChecked(); scrollArea->setWidgetResizable(fitToWindow); - if (!fitToWindow) { + if (!fitToWindow) normalSize(); - } updateActions(); } //! [14] @@ -199,79 +282,66 @@ void ImageViewer::about() void ImageViewer::createActions() //! [17] //! [18] { - openAct = new QAction(tr("&Open..."), this); - openAct->setShortcut(tr("Ctrl+O")); - connect(openAct, SIGNAL(triggered()), this, SLOT(open())); + QMenu *fileMenu = menuBar()->addMenu(tr("&File")); + + QAction *openAct = fileMenu->addAction(tr("&Open..."), this, &ImageViewer::open); + openAct->setShortcut(QKeySequence::Open); + + saveAsAct = fileMenu->addAction(tr("&Save As..."), this, &ImageViewer::saveAs); + saveAsAct->setEnabled(false); - printAct = new QAction(tr("&Print..."), this); - printAct->setShortcut(tr("Ctrl+P")); + printAct = fileMenu->addAction(tr("&Print..."), this, &ImageViewer::print); + printAct->setShortcut(QKeySequence::Print); printAct->setEnabled(false); - connect(printAct, SIGNAL(triggered()), this, SLOT(print())); - exitAct = new QAction(tr("E&xit"), this); + fileMenu->addSeparator(); + + QAction *exitAct = fileMenu->addAction(tr("E&xit"), this, &QWidget::close); exitAct->setShortcut(tr("Ctrl+Q")); - connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); - zoomInAct = new QAction(tr("Zoom &In (25%)"), this); - zoomInAct->setShortcut(tr("Ctrl++")); + QMenu *editMenu = menuBar()->addMenu(tr("&Edit")); + + copyAct = editMenu->addAction(tr("&Copy"), this, &ImageViewer::copy); + copyAct->setShortcut(QKeySequence::Copy); + copyAct->setEnabled(false); + + QAction *pasteAct = editMenu->addAction(tr("&Paste"), this, &ImageViewer::paste); + pasteAct->setShortcut(QKeySequence::Paste); + + QMenu *viewMenu = menuBar()->addMenu(tr("&View")); + + zoomInAct = viewMenu->addAction(tr("Zoom &In (25%)"), this, &ImageViewer::zoomIn); + zoomInAct->setShortcut(QKeySequence::ZoomIn); zoomInAct->setEnabled(false); - connect(zoomInAct, SIGNAL(triggered()), this, SLOT(zoomIn())); - zoomOutAct = new QAction(tr("Zoom &Out (25%)"), this); - zoomOutAct->setShortcut(tr("Ctrl+-")); + zoomOutAct = viewMenu->addAction(tr("Zoom &Out (25%)"), this, &ImageViewer::zoomOut); + zoomOutAct->setShortcut(QKeySequence::ZoomOut); zoomOutAct->setEnabled(false); - connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(zoomOut())); - normalSizeAct = new QAction(tr("&Normal Size"), this); + normalSizeAct = viewMenu->addAction(tr("&Normal Size"), this, &ImageViewer::normalSize); normalSizeAct->setShortcut(tr("Ctrl+S")); normalSizeAct->setEnabled(false); - connect(normalSizeAct, SIGNAL(triggered()), this, SLOT(normalSize())); - fitToWindowAct = new QAction(tr("&Fit to Window"), this); + viewMenu->addSeparator(); + + fitToWindowAct = viewMenu->addAction(tr("&Fit to Window"), this, &ImageViewer::fitToWindow); 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())); + QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); - aboutQtAct = new QAction(tr("About &Qt"), this); - connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); + helpMenu->addAction(tr("&About"), this, &ImageViewer::about); + helpMenu->addAction(tr("About &Qt"), &QApplication::aboutQt); } //! [18] -//! [19] -void ImageViewer::createMenus() -//! [19] //! [20] -{ - 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); -} -//! [20] - //! [21] void ImageViewer::updateActions() //! [21] //! [22] { + saveAsAct->setEnabled(!image.isNull()); + copyAct->setEnabled(!image.isNull()); zoomInAct->setEnabled(!fitToWindowAct->isChecked()); zoomOutAct->setEnabled(!fitToWindowAct->isChecked()); normalSizeAct->setEnabled(!fitToWindowAct->isChecked()); |