summaryrefslogtreecommitdiffstats
path: root/examples/widgets/desktop/screenshot/screenshot.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/widgets/desktop/screenshot/screenshot.cpp')
-rw-r--r--examples/widgets/desktop/screenshot/screenshot.cpp139
1 files changed, 68 insertions, 71 deletions
diff --git a/examples/widgets/desktop/screenshot/screenshot.cpp b/examples/widgets/desktop/screenshot/screenshot.cpp
index bfca5a45ae..354fe36369 100644
--- a/examples/widgets/desktop/screenshot/screenshot.cpp
+++ b/examples/widgets/desktop/screenshot/screenshot.cpp
@@ -44,20 +44,48 @@
//! [0]
Screenshot::Screenshot()
+ : screenshotLabel(new QLabel(this))
{
- screenshotLabel = new QLabel;
screenshotLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
screenshotLabel->setAlignment(Qt::AlignCenter);
- screenshotLabel->setMinimumSize(240, 160);
- createOptionsGroupBox();
- createButtonsLayout();
+ const QRect screenGeometry = QApplication::desktop()->screenGeometry(this);
+ screenshotLabel->setMinimumSize(screenGeometry.width() / 8, screenGeometry.height() / 8);
- mainLayout = new QVBoxLayout;
+ QVBoxLayout *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(screenshotLabel);
+
+ QGroupBox *optionsGroupBox = new QGroupBox(tr("Options"), this);
+ delaySpinBox = new QSpinBox(optionsGroupBox);
+ delaySpinBox->setSuffix(tr(" s"));
+ delaySpinBox->setMaximum(60);
+
+ typedef void (QSpinBox::*QSpinBoxIntSignal)(int);
+ connect(delaySpinBox, static_cast<QSpinBoxIntSignal>(&QSpinBox::valueChanged),
+ this, &Screenshot::updateCheckBox);
+
+ hideThisWindowCheckBox = new QCheckBox(tr("Hide This Window"), optionsGroupBox);
+
+ QGridLayout *optionsGroupBoxLayout = new QGridLayout(optionsGroupBox);
+ optionsGroupBoxLayout->addWidget(new QLabel(tr("Screenshot Delay:"), this), 0, 0);
+ optionsGroupBoxLayout->addWidget(delaySpinBox, 0, 1);
+ optionsGroupBoxLayout->addWidget(hideThisWindowCheckBox, 1, 0, 1, 2);
+
mainLayout->addWidget(optionsGroupBox);
+
+ QHBoxLayout *buttonsLayout = new QHBoxLayout;
+ newScreenshotButton = new QPushButton(tr("New Screenshot"), this);
+ connect(newScreenshotButton, &QPushButton::clicked, this, &Screenshot::newScreenshot);
+ buttonsLayout->addWidget(newScreenshotButton);
+ QPushButton *saveScreenshotButton = new QPushButton(tr("Save Screenshot"), this);
+ connect(saveScreenshotButton, &QPushButton::clicked, this, &Screenshot::saveScreenshot);
+ buttonsLayout->addWidget(saveScreenshotButton);
+ QPushButton *quitScreenshotButton = new QPushButton(tr("Quit"), this);
+ quitScreenshotButton->setShortcut(Qt::CTRL + Qt::Key_Q);
+ connect(quitScreenshotButton, &QPushButton::clicked, this, &QWidget::close);
+ buttonsLayout->addWidget(quitScreenshotButton);
+ buttonsLayout->addStretch();
mainLayout->addLayout(buttonsLayout);
- setLayout(mainLayout);
shootScreen();
delaySpinBox->setValue(5);
@@ -84,44 +112,59 @@ void Screenshot::newScreenshot()
hide();
newScreenshotButton->setDisabled(true);
- QTimer::singleShot(delaySpinBox->value() * 1000, this, SLOT(shootScreen()));
+ QTimer::singleShot(delaySpinBox->value() * 1000, this, &Screenshot::shootScreen);
}
//! [2]
//! [3]
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());
+ const QString format = "png";
+ QString initialPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
+ if (initialPath.isEmpty())
+ initialPath = QDir::currentPath();
+ initialPath += tr("/untitled.") + format;
+
+ QFileDialog fileDialog(this, tr("Save As"), initialPath);
+ fileDialog.setAcceptMode(QFileDialog::AcceptSave);
+ fileDialog.setFileMode(QFileDialog::AnyFile);
+ fileDialog.setDirectory(initialPath);
+ QStringList mimeTypes;
+ foreach (const QByteArray &bf, QImageWriter::supportedMimeTypes())
+ mimeTypes.append(QLatin1String(bf));
+ fileDialog.setMimeTypeFilters(mimeTypes);
+ fileDialog.selectMimeTypeFilter("image/" + format);
+ fileDialog.setDefaultSuffix(format);
+ if (fileDialog.exec() != QDialog::Accepted)
+ return;
+ const QString fileName = fileDialog.selectedFiles().first();
+ if (!originalPixmap.save(fileName)) {
+ QMessageBox::warning(this, tr("Save Error"), tr("The image could not be saved to \"%1\".")
+ .arg(QDir::toNativeSeparators(fileName)));
+ }
}
//! [3]
//! [4]
void Screenshot::shootScreen()
{
- if (delaySpinBox->value() != 0)
- qApp->beep();
-//! [4]
- originalPixmap = QPixmap(); // clear image for low memory situations
- // on embedded devices.
-//! [5]
QScreen *screen = QGuiApplication::primaryScreen();
- if (screen)
- originalPixmap = screen->grabWindow(0);
+ if (const QWindow *window = windowHandle())
+ screen = window->screen();
+ if (!screen)
+ return;
+
+ if (delaySpinBox->value() != 0)
+ QApplication::beep();
+
+ originalPixmap = screen->grabWindow(0);
updateScreenshotLabel();
newScreenshotButton->setDisabled(false);
if (hideThisWindowCheckBox->isChecked())
show();
}
-//! [5]
+//! [4]
//! [6]
void Screenshot::updateCheckBox()
@@ -135,52 +178,6 @@ void Screenshot::updateCheckBox()
}
//! [6]
-//! [7]
-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);
-}
-//! [7]
-
-//! [8]
-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);
-}
-//! [8]
-
-//! [9]
-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;
-}
-//! [9]
//! [10]
void Screenshot::updateScreenshotLabel()