Загрузка страницы с рамками для скриншота - PullRequest
3 голосов
/ 18 июня 2010

У меня есть приложение, которое отображает веб-страницу в iframe, а затем загружает X изображений в div, который перекрывает фрейм.

Итак, у меня есть этот скрипт на python, который загружает URL и делает снимок экрана. Он работает на обычных веб-страницах, но я думаю, что фрейм отбрасывает его. Ниже мой код и ссылка на скриншот, который он берет.

#!/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)

Так что что-то не загружается должным образом, чтобы испортить содержимоеSize (). Идеи о том, где я ошибся?

1 Ответ

0 голосов
/ 17 апреля 2012

Один из вариантов - установить вменяемый предпочтительный размер с помощью QWebPage.setPreferredContentsSize() перед загрузкой страницы.Таким образом, ваш размер фрейма всегда будет таким, какой вы предпочитаете.(Это также заставит некоторые страницы визуализироваться более разумным способом, вместо того, чтобы использовать очень минимальную ширину)

В противном случае вам придется перебирать все дочерние кадры и самостоятельно вычислять размер основного кадра, который может статьдовольно сложный, и может работать или не работать правильно.

...