Qt 6.11 is out! See what's new in the release
blog
How do I create a print preview of QWebEngineView in pyqt6?
-
I'm trying to create a print preview or print dialog of a QWebEngineView but I can't get it to work.
Here's my code in pyqt6.2.3 - python-3.9.7 (need to print aftrer 7 seconds):
from PyQt6.QtCore import (QCoreApplication, QEventLoop, QObject, QPointF, Qt, QUrl, pyqtSlot) from PyQt6.QtGui import QKeySequence, QPainter, QShortcut from PyQt6.QtPrintSupport import QPrintDialog, QPrinter, QPrintPreviewDialog, QAbstractPrintDialog from PyQt6.QtWebEngineWidgets import QWebEngineView from PyQt6.QtWidgets import QApplication, QDialog, QLabel, QProgressBar, QProgressDialog, QWidget class PrintHandler(QObject): def __init__(self, parent = None): super().__init__(parent) self.m_page = None self.m_inPrintPreview = False def setPage(self, page): assert not self.m_page self.m_page = page self.m_page.printRequested.connect(self.printPreview) @pyqtSlot() def print(self): printer = QPrinter(QPrinter.PrinterMode.HighResolution) dialog = QPrintDialog(printer, self.m_page.view()) if dialog.exec() != QDialog.accepted: return self.printDocument(printer) @pyqtSlot() def printPreview(self): if not self.m_page: return if self.m_inPrintPreview: return self.m_inPrintPreview = True printer = QPrinter() preview = QPrintPreviewDialog(printer) preview.paintRequested.connect(self.printDocument) preview.exec() self.m_inPrintPreview = False @pyqtSlot(QPrinter) def printDocument(self, printer): loop = QEventLoop() result = False def printPreview(success): nonlocal result result = success loop.quit() progressbar = QProgressDialog(self.m_page.view()) progressbar.findChild(QProgressBar).setTextVisible(False) progressbar.setLabelText("Wait please...") progressbar.setRange(0, 0) progressbar.show() progressbar.canceled.connect(loop.quit) self.m_page.print(printer, printPreview) loop.exec_() progressbar.close() if not result: painter = QPainter() if painter.begin(printer): font = painter.font() font.setPixelSize(20) painter.setFont(font) painter.drawText(QPointF(10, 25), "Could not generate print preview.") painter.end() def main(): import sys # QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling) app = QApplication(sys.argv) app.setApplicationName("Previewer") view = QWebEngineView() view.setUrl(QUrl("https://forum.qt.io/category/58/qt-for-python")) view.resize(1024, 750) view.show() # printPreviewShortCut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_P), view) # printShortCut = QShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_P), view) import threading def gfg(): print("1234") handler = PrintHandler() handler.setPage(view.page()) handler.print() # handler.printPreview() timer = threading.Timer(7.0, gfg) timer.start() sys.exit(app.exec()) if __name__ == "__main__": main()