我正在尝试使用 QtWebEngineView 保存网站的屏幕截图,但生成的图像总是空的。
import sys
import time
from PyQt6.QtCore import *
from PyQt6.QtGui import *
from PyQt6.QtWidgets import QApplication, QWidget
from PyQt6.QtWebEngineWidgets import QWebEngineView
class Screenshot(QWebEngineView):
def __init__(self):
self.app = QApplication(sys.argv)
QWebEngineView.__init__(self)
self._loaded = False
self.loadFinished.connect(self._loadFinished)
def capture(self, url, output_file):
self.resize(QSize(1024, 768))
self.load(QUrl(url))
self.wait_load()
image = QImage(self.size(), QImage.Format.Format_ARGB32)
painter = QPainter(image)
self.render(painter)
painter.end()
image.save(output_file)
def wait_load(self, delay=0):
# process app events until page loaded
while not self._loaded:
self.app.processEvents()
time.sleep(delay)
self._loaded = False
def _loadFinished(self, result):
self._loaded = True
s = Screenshot()
s.capture("https://www.google.com", "screenshot.png")
我尝试过各种代码,其中 QTWebEngineView 在应用程序窗口中呈现,并且该部分可以正常工作。它还wait_load
确保在继续绘制之前加载网站。但不知何故,渲染的图像始终是全白 png,而不是网站。
编辑:投票重新开庭,因为“重复”中的解决方案似乎无法解决此案。
问题是由于未调用 show() 方法导致 QWebengineView 未被渲染。如其他帖子中所述,您还应该使用
Qt.WidgetAttribute.WA_DontShowOnScreen
。这是一个避免使用time.sleep
和 的版本QXApplication.processEvents
。