from qgis.PyQt.QtCore import ( QUrl, QSize ) from qgis.core import ( QgsLayoutItem, QgsLayoutItemRegistry, QgsLayoutItemAbstractMetadata, QgsNetworkAccessManager, QgsMessageLog, QgsGeometry ) from qgis.PyQt.QtWebKitWidgets import QWebPage ITEM_TYPE = QgsLayoutItemRegistry.PluginItem + 1338 class LoggingWebPage(QWebPage): def __init__(self, parent=None): super().__init__(parent) def javaScriptConsoleMessage(self, message, lineNumber, source): QgsMessageLog.logMessage('{}:{} {}'.format(source, lineNumber, message), 'plot-layout') class PlotLayoutItem(QgsLayoutItem): def __init__(self, layout): super().__init__(layout) self.web_page = LoggingWebPage(self) self.web_page.mainFrame().setZoomFactor(30.0) self.html_units_to_layout_units = self.calculate_html_units_to_layout_units() def calculate_html_units_to_layout_units(self): if not self.layout(): return 1 return 72 def draw(self, context): base_url = QUrl.fromLocalFile(self.layout().project().absoluteFilePath()) self.web_page.setViewportSize(QSize(self.rect().width() * self.html_units_to_layout_units, self.rect().height() * self.html_units_to_layout_units)) self.web_page.mainFrame().setHtml('Hello', base_url) # almost a direct copy from QgsLayoutItemLabel! painter = context.renderContext().painter() painter.save() # painter is scaled to dots, so scale back to layout units painter.scale(context.renderContext().scaleFactor() / self.html_units_to_layout_units, context.renderContext().scaleFactor() / self.html_units_to_layout_units) self.web_page.mainFrame().render(painter) def type(self): return ITEM_TYPE class PlotLayoutItemMetadata(QgsLayoutItemAbstractMetadata): def __init__(self): super().__init__(ITEM_TYPE, 'layoutItem') def createItem(self, layout): return PlotLayoutItem(layout)