【问题标题】:PyQt5 render with QWebEngineViewPyQt5 使用 QWebEngineView 渲染
【发布时间】:2017-11-17 06:56:33
【问题描述】:

我想将网页渲染到屏幕外的图像,但是当我使用以下代码时,输​​出图像是空白的,我无法解决问题

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()

【问题讨论】:

    标签: python qt pyqt pyqt5 qwebengineview


    【解决方案1】:

    您必须启用ScreenCaptureEnabled 属性,为此您必须首先启用PluginsEnabled 属性。另外,使用 show 后会渲染内容,但由于您不想显示小部件,因此我们启用了WA_DontShowOnScreen 属性。

    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()
    

    【讨论】:

    • 我知道这是一个老问题,但我会试一试:这个解决方案对于“真实”网页非常有效,但如果我使用本地文件(并使用 QUrl.fromLocalFile(self .url)) 结果总是一个空白页。似乎信号 loadFinished 被提早了。
    • @JoergVanAken self.url 是什么?并显示您的 HTML 以进行测试。
    • 非常感谢您的回复!我应该更精确。 self.url 类似于 r'\C:\Output.html。如果我注释掉 self.close,页面将呈现正确。如果我在closeEvent 中调用save 方法并手动关闭窗口,我可以生成一个png 文件。但是“自动”的方式行不通。
    • @JoergVanAken 再试一次
    • 非常抱歉,page.png 仍然是空白页。
    猜你喜欢
    • 2016-10-11
    • 2021-05-09
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多