- Qt 5.5
- Qt Widgets
- Screenshot Example
- screenshot.cpp Example File
- Qt 5.5.1 Reference Documentation

# screenshot.cpp Example File

desktop/screenshot/screenshot.cpp

    /****************************************************************************
    **
    ** Copyright (C) 2015 The Qt Company Ltd.
    ** Contact: http://www.qt.io/licensing/
    **
    ** This file is part of the examples of the Qt Toolkit.
    **
    ** $QT_BEGIN_LICENSE:BSD$
    ** You may use this file under the terms of the BSD license as follows:
    **
    ** "Redistribution and use in source and binary forms, with or without
    ** modification, are permitted provided that the following conditions are
    ** met:
    **   * Redistributions of source code must retain the above copyright
    **     notice, this list of conditions and the following disclaimer.
    **   * Redistributions in binary form must reproduce the above copyright
    **     notice, this list of conditions and the following disclaimer in
    **     the documentation and/or other materials provided with the
    **     distribution.
    **   * Neither the name of The Qt Company Ltd nor the names of its
    **     contributors may be used to endorse or promote products derived
    **     from this software without specific prior written permission.
    **
    **
    ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
    **
    ** $QT_END_LICENSE$
    **
    ****************************************************************************/

    #include <QtWidgets>

    #include "screenshot.h"

    Screenshot::Screenshot()
    {
        screenshotLabel = new QLabel;
        screenshotLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
        screenshotLabel->setAlignment(Qt::AlignCenter);
        screenshotLabel->setMinimumSize(240, 160);

        createOptionsGroupBox();
        createButtonsLayout();

        mainLayout = new QVBoxLayout;
        mainLayout->addWidget(screenshotLabel);
        mainLayout->addWidget(optionsGroupBox);
        mainLayout->addLayout(buttonsLayout);
        setLayout(mainLayout);

        shootScreen();
        delaySpinBox->setValue(5);

        setWindowTitle(tr("Screenshot"));
        resize(300, 200);
    }

    void Screenshot::resizeEvent(QResizeEvent * /* event */)
    {
        QSize scaledSize = originalPixmap.size();
        scaledSize.scale(screenshotLabel->size(), Qt::KeepAspectRatio);
        if (!screenshotLabel->pixmap() || scaledSize != screenshotLabel->pixmap()->size())
            updateScreenshotLabel();
    }

    void Screenshot::newScreenshot()
    {
        if (hideThisWindowCheckBox->isChecked())
            hide();
        newScreenshotButton->setDisabled(true);

        QTimer::singleShot(delaySpinBox->value() * 1000, this, SLOT(shootScreen()));
    }

    void Screenshot::saveScreenshot()
    {
        QString format = "png";
        QString initialPath = QDir::currentPath() + tr("/untitled.") + format;

        QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), initialPath,
                                                        tr("%1 Files (*.%2);;All Files (*)")
                                                        .arg(format.toUpper())
                                                        .arg(format));
        if (!fileName.isEmpty())
            originalPixmap.save(fileName, format.toLatin1().constData());
    }

    void Screenshot::shootScreen()
    {
        if (delaySpinBox->value() != 0)
            qApp->beep();
        originalPixmap = QPixmap(); // clear image for low memory situations
                                    // on embedded devices.
        QScreen *screen = QGuiApplication::primaryScreen();
        if (screen)
            originalPixmap = screen->grabWindow(0);
        updateScreenshotLabel();

        newScreenshotButton->setDisabled(false);
        if (hideThisWindowCheckBox->isChecked())
            show();
    }

    void Screenshot::updateCheckBox()
    {
        if (delaySpinBox->value() == 0) {
            hideThisWindowCheckBox->setDisabled(true);
            hideThisWindowCheckBox->setChecked(false);
        } else {
            hideThisWindowCheckBox->setDisabled(false);
        }
    }

    void Screenshot::createOptionsGroupBox()
    {
        optionsGroupBox = new QGroupBox(tr("Options"));

        delaySpinBox = new QSpinBox;
        delaySpinBox->setSuffix(tr(" s"));
        delaySpinBox->setMaximum(60);
        connect(delaySpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateCheckBox()));

        delaySpinBoxLabel = new QLabel(tr("Screenshot Delay:"));

        hideThisWindowCheckBox = new QCheckBox(tr("Hide This Window"));

        optionsGroupBoxLayout = new QGridLayout;
        optionsGroupBoxLayout->addWidget(delaySpinBoxLabel, 0, 0);
        optionsGroupBoxLayout->addWidget(delaySpinBox, 0, 1);
        optionsGroupBoxLayout->addWidget(hideThisWindowCheckBox, 1, 0, 1, 2);
        optionsGroupBox->setLayout(optionsGroupBoxLayout);
    }

    void Screenshot::createButtonsLayout()
    {
        newScreenshotButton = createButton(tr("New Screenshot"), this, SLOT(newScreenshot()));
        saveScreenshotButton = createButton(tr("Save Screenshot"), this, SLOT(saveScreenshot()));
        quitScreenshotButton = createButton(tr("Quit"), this, SLOT(close()));

        buttonsLayout = new QHBoxLayout;
        buttonsLayout->addStretch();
        buttonsLayout->addWidget(newScreenshotButton);
        buttonsLayout->addWidget(saveScreenshotButton);
        buttonsLayout->addWidget(quitScreenshotButton);
    }

    QPushButton *Screenshot::createButton(const QString &text, QWidget *receiver,
                                          const char *member)
    {
        QPushButton *button = new QPushButton(text);
        button->connect(button, SIGNAL(clicked()), receiver, member);
        return button;
    }

    void Screenshot::updateScreenshotLabel()
    {
        screenshotLabel->setPixmap(originalPixmap.scaled(screenshotLabel->size(),
                                                         Qt::KeepAspectRatio,
                                                         Qt::SmoothTransformation));
    }