Как напечатать HTML-страницу с изображением в Qprinter pyqt5 - PullRequest
0 голосов
/ 15 февраля 2019

Я сгенерировал отчет для моей программы, используя HTML-код, но он не показывает изображение в Qprinter.

def run(self):
    view = QtWebEngineWidgets.QWebEngineView()
    view.setHtml("""<img src="header.jpeg" alt="logo" width="280" height="100">""")
    printer = QPrinter()
    printer.setPaperSize(QtCore.QSizeF(80 ,297), QPrinter.Millimeter)
    try :
        r = QPrintDialog(printer)
        if r.exec_() == QPrintDialog.Accepted:
            view.page().print(printer, self.print_completed)
    except Exception as e :
        print(e)

HTML-код, который я хочу напечатать.header.jpeg в том же каталоге.

1 Ответ

0 голосов
/ 15 февраля 2019

Qt Webengine выполняет задачи асинхронно, как печать, и, поскольку представление и принтер являются локальными переменными, они будут удалены после завершения функции синхронизации.Решение состоит в том, чтобы сохранить эти объекты даже после завершения работы.

Нет необходимости использовать QWebEngineView, поскольку вы ничего не будете показывать, просто QWebEnginePage.

С другой стороны, документы утверждают, что внешние ресурсы, такие как изображения, загружаются на основе URL-адреса, которому передается второй параметр.Таким образом, решение состоит в том, чтобы передать URL, используя текущий каталог в качестве основы.

import os
# ...
def run(self):
    current_dir = os.path.dirname(os.path.abspath(__file__))
    self._page = QtWebEngineWidgets.QWebEnginePage()
    self._page.setHtml('''
    ... <img src="header.jpeg" alt="logo" width="280" height="100"> ...
    ''', QtCore.QUrl.fromLocalFile(os.path.join(current_dir, "index.html")))
    self._printer = QtPrintSupport.QPrinter()
    self._printer.setPaperSize(QtCore.QSizeF(80 ,297), QtPrintSupport.QPrinter.Millimeter)
    r = QtPrintSupport.QPrintDialog(self._printer)
    if r.exec_() == QtPrintSupport.QPrintDialog.Accepted:
        self._page.print(self._printer, self.print_completed)
...