From 367e6ff0b20be47fdc9ddd72866053ec60cbe254 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 29 Feb 2024 15:18:19 +0100 Subject: [PATCH] Fix previewing a preview on reentrance Make the print preview more tolerant of reentrance by avoiding previewing itself. Change-Id: Ia4774cb51bdda7d311414c4e2f9c2bfbed4f187f Pick-to: 6.7 6.6 6.5 Fixes: QTBUG-122749 Reviewed-by: Friedemann Kleint --- src/printsupport/kernel/qprinter.cpp | 5 +++++ src/printsupport/kernel/qprinter_p.h | 1 + src/printsupport/widgets/qprintpreviewwidget.cpp | 3 +++ 3 files changed, 9 insertions(+) diff --git a/src/printsupport/kernel/qprinter.cpp b/src/printsupport/kernel/qprinter.cpp index c4af319c0c..10c4c681ba 100644 --- a/src/printsupport/kernel/qprinter.cpp +++ b/src/printsupport/kernel/qprinter.cpp @@ -129,6 +129,11 @@ QList QPrinterPrivate::previewPages() const return QList(); } +bool QPrinterPrivate::previewMode() const +{ + return (previewEngine != nullptr) && (previewEngine == printEngine); +} + void QPrinterPrivate::setPreviewMode(bool enable) { Q_Q(QPrinter); diff --git a/src/printsupport/kernel/qprinter_p.h b/src/printsupport/kernel/qprinter_p.h index 3c6cf711b0..77dd5fb4bc 100644 --- a/src/printsupport/kernel/qprinter_p.h +++ b/src/printsupport/kernel/qprinter_p.h @@ -70,6 +70,7 @@ public: #if QT_CONFIG(printpreviewwidget) QList previewPages() const; void setPreviewMode(bool); + bool previewMode() const; #endif void setProperty(QPrintEngine::PrintEnginePropertyKey key, const QVariant &value); diff --git a/src/printsupport/widgets/qprintpreviewwidget.cpp b/src/printsupport/widgets/qprintpreviewwidget.cpp index 97e8f8a7c2..637eb42505 100644 --- a/src/printsupport/widgets/qprintpreviewwidget.cpp +++ b/src/printsupport/widgets/qprintpreviewwidget.cpp @@ -361,6 +361,9 @@ void QPrintPreviewWidgetPrivate::generatePreview() //### emit paintRequested() until the user changes some parameter Q_Q(QPrintPreviewWidget); + // Avoid previewing a preview + if (printer->d_func()->previewMode()) + return; printer->d_func()->setPreviewMode(true); emit q->paintRequested(printer); printer->d_func()->setPreviewMode(false);