Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. How do I create a print preview of QWebEngineView in pyqt6?
Qt 6.11 is out! See what's new in the release blog

How do I create a print preview of QWebEngineView in pyqt6?

Scheduled Pinned Locked Moved Unsolved Qt for Python
1 Posts 1 Posters 1.2k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • R Offline
    R Offline
    roombon
    wrote on last edited by
    #1

    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()
    
    
    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved