3

iframe で Web ページをレンダリングし、フレームをオーバーレイする div に X 個の画像を読み込むアプリがあります。

だから私はURLをロードしてスクリーンショットを撮るこのpythonスクリプトを持っています。通常の Web ページでは動作しますが、フレームがおかしいと思います。以下は私のコードと、それが取っているスクリーンショットへのリンクです。

#!/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 は、私のインスタンスでは実際には機能していないようです。「プレースホルダー テキスト」は Web ページの一部であり、画像がグレーのようなもので、左上に青いスマグとカラー キーがあります。

アプリの webpage.mainFrame().contentsSize() の内容を印刷すると、 PyQt4.QtCore.QSize(400, 158) が表示されます

しかし、www.google.com のようなものをレンダリングすると、PyQt4.QtCore.QSize(617, 573) が得られます。

そのため、contentsSize() を台無しにするために何かが適切にロードされていません。どこが間違っているかについてのアイデアはありますか?

4

1 に答える 1

0

QWebPage.setPreferredContentsSize()1 つのオプションは、ページをロードする前に適切なサイズを設定することです。このようにして、フレームセットのサイズは常にその推奨サイズになります。(これにより、非常に最小限の幅を使用する代わりに、一部のページがより賢明な方法でレンダリングされます)

そうしないと、すべての子フレームを繰り返し処理し、メイン フレームのサイズを自分で計算する必要があります。これは非常に複雑になり、正しく機能する場合と機能しない場合があります。

于 2012-04-17T10:52:48.520 に答える