summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@qt.io>2020-03-16 18:41:27 +0100
committerSimon Hausmann <simon.hausmann@qt.io>2020-03-16 18:41:27 +0100
commitff922e7b87de147797fbd759167878aec7625f0c (patch)
treea326819f23e2421723f144522f9362ba608d6bb1 /examples
parente464e1eb8eb63c631fb0916c3ea4540a88d8aad3 (diff)
parent75f52bd0ddc4afbd181c14b310d256e3507052d6 (diff)
Merge remote-tracking branch 'origin/5.15' into dev
Conflicts: src/corelib/kernel/qmetatype.cpp Change-Id: I88eb0d3e9c9a38abf7241a51e370c655ae74e38a
Diffstat (limited to 'examples')
-rw-r--r--examples/corelib/threads/doc/src/mandelbrot.qdoc25
-rw-r--r--examples/corelib/threads/mandelbrot/main.cpp2
-rw-r--r--examples/corelib/threads/mandelbrot/mandelbrotwidget.cpp25
-rw-r--r--examples/corelib/threads/mandelbrot/renderthread.cpp12
-rw-r--r--examples/corelib/threads/mandelbrot/renderthread.h4
-rw-r--r--examples/widgets/itemviews/spreadsheet/printview.cpp12
-rw-r--r--examples/widgets/itemviews/spreadsheet/spreadsheet.cpp2
-rw-r--r--examples/widgets/richtext/textedit/textedit.cpp12
-rw-r--r--examples/widgets/tutorials/notepad/notepad.pro2
-rw-r--r--examples/widgets/widgets/imageviewer/imageviewer.cpp9
-rw-r--r--examples/widgets/widgets/imageviewer/imageviewer.h10
11 files changed, 77 insertions, 38 deletions
diff --git a/examples/corelib/threads/doc/src/mandelbrot.qdoc b/examples/corelib/threads/doc/src/mandelbrot.qdoc
index b32fa097b3..2b12743538 100644
--- a/examples/corelib/threads/doc/src/mandelbrot.qdoc
+++ b/examples/corelib/threads/doc/src/mandelbrot.qdoc
@@ -187,6 +187,10 @@
generate more and more precise (and computationally expensive)
approximations of the fractal.
+ We create a high resolution pixmap by applying the device
+ pixel ratio to the target size (see
+ \l{Drawing High Resolution Versions of Pixmaps and Images}).
+
If we discover inside the loop that \c restart has been set to \c
true (by \c render()), we break out of the loop immediately, so
that the control quickly returns to the very top of the outer
@@ -273,12 +277,21 @@
\snippet threads/mandelbrot/mandelbrotwidget.cpp 8
If the pixmap has the right scale factor, we draw the pixmap directly onto
- the widget. Otherwise, we scale and translate the \l{Coordinate
- System}{coordinate system} before we draw the pixmap. By reverse mapping
- the widget's rectangle using the scaled painter matrix, we also make sure
- that only the exposed areas of the pixmap are drawn. The calls to
- QPainter::save() and QPainter::restore() make sure that any painting
- performed afterwards uses the standard coordinate system.
+ the widget.
+
+ Otherwise, we create a preview pixmap to be shown until the calculation
+ finishes and translate the \l{Coordinate System}{coordinate system}
+ accordingly.
+
+ Since we are going to use transformations on the painter
+ and use an overload of QPainter::drawPixmap() that does not support
+ high resolution pixmaps in that case, we create a pixmap with device pixel
+ ratio 1.
+
+ By reverse mapping the widget's rectangle using the scaled painter matrix,
+ we also make sure that only the exposed areas of the pixmap are drawn.
+ The calls to QPainter::save() and QPainter::restore() make sure that any
+ painting performed afterwards uses the standard coordinate system.
\snippet threads/mandelbrot/mandelbrotwidget.cpp 9
diff --git a/examples/corelib/threads/mandelbrot/main.cpp b/examples/corelib/threads/mandelbrot/main.cpp
index 9832d55514..c5d4835192 100644
--- a/examples/corelib/threads/mandelbrot/main.cpp
+++ b/examples/corelib/threads/mandelbrot/main.cpp
@@ -55,6 +55,8 @@
//! [0]
int main(int argc, char *argv[])
{
+ QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
+ QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
QApplication app(argc, argv);
MandelbrotWidget widget;
widget.show();
diff --git a/examples/corelib/threads/mandelbrot/mandelbrotwidget.cpp b/examples/corelib/threads/mandelbrot/mandelbrotwidget.cpp
index 420fd6186a..f47c9c8a8b 100644
--- a/examples/corelib/threads/mandelbrot/mandelbrotwidget.cpp
+++ b/examples/corelib/threads/mandelbrot/mandelbrotwidget.cpp
@@ -107,18 +107,22 @@ void MandelbrotWidget::paintEvent(QPaintEvent * /* event */)
//! [6] //! [7]
} else {
//! [7] //! [8]
+ auto previewPixmap = qFuzzyCompare(pixmap.devicePixelRatioF(), qreal(1))
+ ? pixmap
+ : pixmap.scaled(pixmap.size() / pixmap.devicePixelRatioF(), Qt::KeepAspectRatio,
+ Qt::SmoothTransformation);
double scaleFactor = pixmapScale / curScale;
- int newWidth = int(pixmap.width() * scaleFactor);
- int newHeight = int(pixmap.height() * scaleFactor);
- int newX = pixmapOffset.x() + (pixmap.width() - newWidth) / 2;
- int newY = pixmapOffset.y() + (pixmap.height() - newHeight) / 2;
+ int newWidth = int(previewPixmap.width() * scaleFactor);
+ int newHeight = int(previewPixmap.height() * scaleFactor);
+ int newX = pixmapOffset.x() + (previewPixmap.width() - newWidth) / 2;
+ int newY = pixmapOffset.y() + (previewPixmap.height() - newHeight) / 2;
painter.save();
painter.translate(newX, newY);
painter.scale(scaleFactor, scaleFactor);
QRectF exposed = painter.transform().inverted().mapRect(rect()).adjusted(-1, -1, 1, 1);
- painter.drawPixmap(exposed, pixmap, exposed);
+ painter.drawPixmap(exposed, previewPixmap, exposed);
painter.restore();
}
//! [8] //! [9]
@@ -139,7 +143,7 @@ void MandelbrotWidget::paintEvent(QPaintEvent * /* event */)
//! [10]
void MandelbrotWidget::resizeEvent(QResizeEvent * /* event */)
{
- thread.render(centerX, centerY, curScale, size());
+ thread.render(centerX, centerY, curScale, size(), devicePixelRatioF());
}
//! [10]
@@ -208,8 +212,9 @@ void MandelbrotWidget::mouseReleaseEvent(QMouseEvent *event)
pixmapOffset += event->pos() - lastDragPos;
lastDragPos = QPoint();
- int deltaX = (width() - pixmap.width()) / 2 - pixmapOffset.x();
- int deltaY = (height() - pixmap.height()) / 2 - pixmapOffset.y();
+ const auto pixmapSize = pixmap.size() / pixmap.devicePixelRatioF();
+ int deltaX = (width() - pixmapSize.width()) / 2 - pixmapOffset.x();
+ int deltaY = (height() - pixmapSize.height()) / 2 - pixmapOffset.y();
scroll(deltaX, deltaY);
}
}
@@ -234,7 +239,7 @@ void MandelbrotWidget::zoom(double zoomFactor)
{
curScale *= zoomFactor;
update();
- thread.render(centerX, centerY, curScale, size());
+ thread.render(centerX, centerY, curScale, size(), devicePixelRatioF());
}
//! [17]
@@ -244,6 +249,6 @@ void MandelbrotWidget::scroll(int deltaX, int deltaY)
centerX += deltaX * curScale;
centerY += deltaY * curScale;
update();
- thread.render(centerX, centerY, curScale, size());
+ thread.render(centerX, centerY, curScale, size(), devicePixelRatioF());
}
//! [18]
diff --git a/examples/corelib/threads/mandelbrot/renderthread.cpp b/examples/corelib/threads/mandelbrot/renderthread.cpp
index 22ce81c32d..4d2009471c 100644
--- a/examples/corelib/threads/mandelbrot/renderthread.cpp
+++ b/examples/corelib/threads/mandelbrot/renderthread.cpp
@@ -76,13 +76,14 @@ RenderThread::~RenderThread()
//! [2]
void RenderThread::render(double centerX, double centerY, double scaleFactor,
- QSize resultSize)
+ QSize resultSize, double devicePixelRatio)
{
QMutexLocker locker(&mutex);
this->centerX = centerX;
this->centerY = centerY;
this->scaleFactor = scaleFactor;
+ this->devicePixelRatio = devicePixelRatio;
this->resultSize = resultSize;
if (!isRunning()) {
@@ -99,8 +100,10 @@ void RenderThread::run()
{
forever {
mutex.lock();
- const QSize resultSize = this->resultSize;
- const double scaleFactor = this->scaleFactor;
+ const double devicePixelRatio = this->devicePixelRatio;
+ const QSize resultSize = this->resultSize * devicePixelRatio;
+ const double requestedScaleFactor = this->scaleFactor;
+ const double scaleFactor = requestedScaleFactor / devicePixelRatio;
const double centerX = this->centerX;
const double centerY = this->centerY;
mutex.unlock();
@@ -111,6 +114,7 @@ void RenderThread::run()
//! [4] //! [5]
int halfHeight = resultSize.height() / 2;
QImage image(resultSize, QImage::Format_RGB32);
+ image.setDevicePixelRatio(devicePixelRatio);
const int NumPasses = 8;
int pass = 0;
@@ -162,7 +166,7 @@ void RenderThread::run()
pass = 4;
} else {
if (!restart)
- emit renderedImage(image, scaleFactor);
+ emit renderedImage(image, requestedScaleFactor);
//! [5] //! [6]
++pass;
}
diff --git a/examples/corelib/threads/mandelbrot/renderthread.h b/examples/corelib/threads/mandelbrot/renderthread.h
index 934cc17d74..6174e0ed3d 100644
--- a/examples/corelib/threads/mandelbrot/renderthread.h
+++ b/examples/corelib/threads/mandelbrot/renderthread.h
@@ -69,7 +69,8 @@ public:
RenderThread(QObject *parent = nullptr);
~RenderThread();
- void render(double centerX, double centerY, double scaleFactor, QSize resultSize);
+ void render(double centerX, double centerY, double scaleFactor, QSize resultSize,
+ double devicePixelRatio);
signals:
void renderedImage(const QImage &image, double scaleFactor);
@@ -85,6 +86,7 @@ private:
double centerX;
double centerY;
double scaleFactor;
+ double devicePixelRatio;
QSize resultSize;
bool restart = false;
bool abort = false;
diff --git a/examples/widgets/itemviews/spreadsheet/printview.cpp b/examples/widgets/itemviews/spreadsheet/printview.cpp
index 7db1a6bad9..7700b4ed6a 100644
--- a/examples/widgets/itemviews/spreadsheet/printview.cpp
+++ b/examples/widgets/itemviews/spreadsheet/printview.cpp
@@ -50,8 +50,12 @@
#include "printview.h"
-#ifndef QT_NO_PRINTER
-#include <QPrinter>
+#if defined(QT_PRINTSUPPORT_LIB)
+# include <QtPrintSupport/qtprintsupportglobal.h>
+
+# if QT_CONFIG(printer)
+# include <QPrinter>
+# endif
#endif
PrintView::PrintView()
@@ -62,9 +66,11 @@ PrintView::PrintView()
void PrintView::print(QPrinter *printer)
{
-#ifndef QT_NO_PRINTER
+#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer)
resize(printer->width(), printer->height());
render(printer);
+#else
+ Q_UNUSED(printer)
#endif
}
diff --git a/examples/widgets/itemviews/spreadsheet/spreadsheet.cpp b/examples/widgets/itemviews/spreadsheet/spreadsheet.cpp
index fc7fbb872c..ac8ea7d437 100644
--- a/examples/widgets/itemviews/spreadsheet/spreadsheet.cpp
+++ b/examples/widgets/itemviews/spreadsheet/spreadsheet.cpp
@@ -638,7 +638,7 @@ QString encode_pos(int row, int col)
void SpreadSheet::print()
{
-#if QT_CONFIG(printpreviewdialog)
+#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printpreviewdialog)
QPrinter printer(QPrinter::ScreenResolution);
QPrintPreviewDialog dlg(&printer);
PrintView view;
diff --git a/examples/widgets/richtext/textedit/textedit.cpp b/examples/widgets/richtext/textedit/textedit.cpp
index 5d27e7df0c..7cfe3f6c05 100644
--- a/examples/widgets/richtext/textedit/textedit.cpp
+++ b/examples/widgets/richtext/textedit/textedit.cpp
@@ -197,7 +197,7 @@ void TextEdit::setupFileActions()
a->setPriority(QAction::LowPriority);
menu->addSeparator();
-#ifndef QT_NO_PRINTER
+#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer)
const QIcon printIcon = QIcon::fromTheme("document-print", QIcon(rsrcPath + "/fileprint.png"));
a = menu->addAction(printIcon, tr("&Print..."), this, &TextEdit::filePrint);
a->setPriority(QAction::LowPriority);
@@ -559,7 +559,7 @@ void TextEdit::filePrint()
void TextEdit::filePrintPreview()
{
-#if QT_CONFIG(printpreviewdialog)
+#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printpreviewdialog)
QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog preview(&printer, this);
connect(&preview, &QPrintPreviewDialog::paintRequested, this, &TextEdit::printPreview);
@@ -569,17 +569,17 @@ void TextEdit::filePrintPreview()
void TextEdit::printPreview(QPrinter *printer)
{
-#ifdef QT_NO_PRINTER
- Q_UNUSED(printer);
-#else
+#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer)
textEdit->print(printer);
+#else
+ Q_UNUSED(printer)
#endif
}
void TextEdit::filePrintPdf()
{
-#ifndef QT_NO_PRINTER
+#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer)
//! [0]
QFileDialog fileDialog(this, tr("Export PDF"));
fileDialog.setAcceptMode(QFileDialog::AcceptSave);
diff --git a/examples/widgets/tutorials/notepad/notepad.pro b/examples/widgets/tutorials/notepad/notepad.pro
index 6451f22735..efe16fc2a2 100644
--- a/examples/widgets/tutorials/notepad/notepad.pro
+++ b/examples/widgets/tutorials/notepad/notepad.pro
@@ -1,6 +1,8 @@
TEMPLATE = app
TARGET = notepad
+QT += widgets
+
qtHaveModule(printsupport): QT += printsupport
requires(qtConfig(fontdialog))
diff --git a/examples/widgets/widgets/imageviewer/imageviewer.cpp b/examples/widgets/widgets/imageviewer/imageviewer.cpp
index 7a0f49308b..7de0c7c45b 100644
--- a/examples/widgets/widgets/imageviewer/imageviewer.cpp
+++ b/examples/widgets/widgets/imageviewer/imageviewer.cpp
@@ -69,10 +69,11 @@
#include <QStatusBar>
#if defined(QT_PRINTSUPPORT_LIB)
-#include <QtPrintSupport/qtprintsupportglobal.h>
-#if QT_CONFIG(printdialog)
-#include <QPrintDialog>
-#endif
+# include <QtPrintSupport/qtprintsupportglobal.h>
+
+# if QT_CONFIG(printdialog)
+# include <QPrintDialog>
+# endif
#endif
//! [0]
diff --git a/examples/widgets/widgets/imageviewer/imageviewer.h b/examples/widgets/widgets/imageviewer/imageviewer.h
index 49c7ac205b..9c8388d470 100644
--- a/examples/widgets/widgets/imageviewer/imageviewer.h
+++ b/examples/widgets/widgets/imageviewer/imageviewer.h
@@ -53,8 +53,12 @@
#include <QMainWindow>
#include <QImage>
-#ifndef QT_NO_PRINTER
-#include <QPrinter>
+#if defined(QT_PRINTSUPPORT_LIB)
+# include <QtPrintSupport/qtprintsupportglobal.h>
+
+# if QT_CONFIG(printer)
+# include <QPrinter>
+# endif
#endif
QT_BEGIN_NAMESPACE
@@ -100,7 +104,7 @@ private:
QScrollArea *scrollArea;
double scaleFactor = 1;
-#ifndef QT_NO_PRINTER
+#if defined(QT_PRINTSUPPORT_LIB) && QT_CONFIG(printer)
QPrinter printer;
#endif