我有一个应用程序在iframe中呈现网页,然后在覆盖框架的div中加载X个图像。
所以我有这个加载网址的python脚本,并截取屏幕截图。它适用于常规网页,但我认为框架正在抛弃它。下面是我的代码,以及它正在拍摄的屏幕截图的链接。
#!/usr/bin/env python
import sys
import signal
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtWebKit import QWebPage
def onLoadFinished(result):
if not result:
print "Request failed"
sys.exit(1)
#screen = QtGui.QDesktopWidget().screenGeometry()
size = webpage.mainFrame().contentsSize()
# Set the size of the (virtual) browser window
webpage.setViewportSize(webpage.mainFrame().contentsSize())
# Paint this frame into an image
image = QImage(webpage.viewportSize(), QImage.Format_ARGB32)
painter = QPainter(image)
webpage.mainFrame().render(painter)
painter.end()
image.save("/var/www/html/output.png")
sys.exit(0)
qtargs = [sys.argv[0]]
qtargs.append("-display")
qtargs.append(":0")
app = QApplication(qtargs,True)
#app = QApplication(sys.argv)
signal.signal(signal.SIGINT, signal.SIG_DFL)
webpage = QWebPage()
webpage.mainFrame().setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
webpage.mainFrame().setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)
webpage.connect(webpage, SIGNAL("loadFinished(bool)"), onLoadFinished)
webpage.mainFrame().load(QUrl("http://localhost/heatmap"))
sys.exit(app.exec_())
截图: http://img28.imageshack.us/img28/7506/outputc.png
正如您在上面的图片中看到的那样,页面缩小为带滚动条的小图像,而不显示整个页面,iframe和div位于其顶部。我是否需要加载样式表或强制它像浏览器一样呈现? Qt.ScrollbarAlwaysOff似乎并没有在我的实例中工作。 “占位符文本”是网页的一部分,图像是使它变成灰色的,左上角有一个蓝色的自鸣得意和颜色键。
当我为我的应用打印webpage.mainFrame()。contentsSize()的内容时,我明白了 PyQt4.QtCore.QSize(400,158)
但是当我渲染像www.google.com这样的东西时,我明白了 PyQt4.QtCore.QSize(617,573)
因此没有正确加载某些东西来搞乱contentSize()。关于我哪里出错的想法?
答案 0 :(得分:0)
一个选项是在加载页面之前使用QWebPage.setPreferredContentsSize()
设置合理的首选大小。这样,您的框架集大小将始终是首选大小。 (这也会使一些页面以更合理的方式呈现,而不是使用非常小的宽度)
否则你需要遍历所有子帧并自己计算主帧大小,这可能变得非常复杂,可能会也可能无法正常工作。