3

我有一个应用程序在 iframe 中呈现网页,然后在覆盖框架的 div 中加载 X 个图像。

所以我有这个加载 url 并截取屏幕截图的 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 在我的实例中似乎并没有真正起作用。“占位符文本”是网页的一部分,而图像使它变成灰色,左上角有一个蓝色的自鸣得意和颜色键。

当我为我的应用打印 pages.mainFrame().contentsSize() 的内容时,我得到 PyQt4.QtCore.QSize(400, 158)

但是当我渲染像 www.google.com 这样的东西时,我得到 PyQt4.QtCore.QSize(617, 573)

所以没有正确加载某些东西来弄乱 contentSize()。关于我哪里出错的想法?

4

1 回答 1

0

QWebPage.setPreferredContentsSize()一种选择是在加载页面之前设置一个合理的首选大小。这样,您的框架集尺寸将始终是首选尺寸。(这也将使某些页面以更合理的方式呈现,而不是使用非常小的宽度)

否则,您将需要遍历所有子帧并自己计算主帧大小,这可能会变得非常复杂,并且可能会或可能不会正常工作。

于 2012-04-17T10:52:48.520 回答