【问题标题】:How do I create a print preview of QWebEngineView in PyQt5?如何在 PyQt5 中创建 QWebEngineView 的打印预览?
【发布时间】:2020-04-13 17:18:35
【问题描述】:

我正在尝试创建 QWebEngineView 的打印预览,但无法正常工作。

这是我的代码:

...
self.view = QWebEngineView()
...

def handle_preview(self):
    dialog = QPrintPreviewDialog()
    dialog.paintRequested.connect(self.view.print_)
    dialog.exec_()

代码给了我这个错误:

AttributeError: 'QWebEngineView' 对象没有属性 'print_'

当我使用 QTextEdit 时,代码运行良好。但这不是我想要的。我想使用 QWebEngineView。

【问题讨论】:

    标签: python pyqt pyqt5 print-preview qwebengineview


    【解决方案1】:

    基于官方示例:WebEngine Widgets PrintMe Example 可以使用以下代码实现预览。

    from PyQt5.QtCore import (QCoreApplication, QEventLoop, QObject, QPointF, Qt,
                           QUrl, pyqtSlot)
    from PyQt5.QtGui import QKeySequence, QPainter
    from PyQt5.QtPrintSupport import QPrintDialog, QPrinter, QPrintPreviewDialog
    from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineView
    from PyQt5.QtWidgets import QApplication, QDialog, QLabel, QProgressBar, QProgressDialog, QShortcut
    
    
    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.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, self.m_page.view())
            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://stackoverflow.com/questions/59438021"))
        view.resize(1024, 750)
        view.show()
    
        handler = PrintHandler()
        handler.setPage(view.page())
    
        printPreviewShortCut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_P), view)
        printShortCut = QShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_P), view)
    
        printPreviewShortCut.activated.connect(handler.printPreview)
        printShortCut.activated.connect(handler.print)
    
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main()
    

    注意:对于 PySide2,您只需将 pyqtSlot 更改为 Slot

    【讨论】:

      猜你喜欢
      • 2021-01-05
      • 2022-01-04
      • 1970-01-01
      • 2020-04-04
      • 2016-07-25
      • 2011-08-04
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多