PyQt5 渲染与 QWebEngineView [英] PyQt5 render with QWebEngineView
本文介绍了PyQt5 渲染与 QWebEngineView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想将网页渲染到屏幕外的图像,但是当我使用以下代码时,输出图像是空白的,我无法解决问题
I want render the webpage to an image offscreen, however when I use following code, the output image is blank, I can't solve the problem
class PageShotter(QWidget):
def __init__(self,url,parent=None):
QWidget.__init__(self,parent)
self.url = url
def shot(self):
self.webview = QtWebEngineWidgets.QWebEngineView(self)
self.webview.load(QtCore.QUrl(self.url))
webpage = self.webview.page()
self.webview.setVisible(True)
self.webview.loadFinished.connect(self.save)
def save(self,finished):
if finished:
size = self.webview.contentsRect()
print(u"width:%d,hight:%d" % (size.width(), size.height()))
img = QtGui.QImage(size.width(), size.height(), QtGui.QImage.Format_ARGB32)
painter = QtGui.QPainter(img)
self.webview.render(painter,QtCore.QPoint())
painter.end()
filename = 'page.png'
if img.save(filename):
filepath = os.path.join(os.path.dirname(__file__), filename)
print(u"success:%s" % filepath)
else:
print(u"fail")
else:
print("Error")
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
shotter = PageShotter(web_site.base_url)
shotter.shot()
app.exec()
推荐答案
您必须启用 ScreenCaptureEnabled
属性,为此您必须先启用 PluginsEnabled
属性.此外,内容是在使用 show 后呈现的,但由于您不想显示小部件,我们启用了 WA_DontShowOnScreen
属性.
You must enable the ScreenCaptureEnabled
attribute, for this you must first enable the PluginsEnabled
attribute. In addition, the content is rendered after using show, but as you do not want to show the widget, we enable the WA_DontShowOnScreen
attribute.
import os
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
class PageShotter(QtWebEngineWidgets.QWebEngineView):
def __init__(self, url, parent=None):
super(PageShotter, self).__init__(parent)
self.loadFinished.connect(self.save)
self.url = url
self.setAttribute(QtCore.Qt.WA_DontShowOnScreen, True)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
self.show()
settings = QtWebEngineWidgets.QWebEngineSettings.globalSettings()
for attr in (QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled,
QtWebEngineWidgets.QWebEngineSettings.ScreenCaptureEnabled,):
settings.setAttribute(attr, True)
def shot(self):
if self.size().isNull():
self.resize(640, 480)
self.load(QtCore.QUrl.fromLocalFile(self.url))
@QtCore.pyqtSlot(bool)
def save(self, finished):
if finished:
size = self.contentsRect()
print(u"width:%d,hight:%d" % (size.width(), size.height()))
img = QtGui.QImage(size.width(), size.height(), QtGui.QImage.Format_ARGB32)
painter = QtGui.QPainter(img)
self.render(painter)
painter.end()
filename = 'page.png'
if img.save(filename):
filepath = os.path.join(os.path.dirname(__file__), filename)
print(u"success:%s" % filepath)
else:
print(u"fail")
else:
print("Error")
self.close()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
shotter = PageShotter(r'C:\Output.html')
shotter.shot()
app.exec()
这篇关于PyQt5 渲染与 QWebEngineView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文