2010-06-18 26 views
3

我有一個應用程序在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。我得到 PyQt4.QtCore.QSize(617,573)

因此,一些東西沒有被正確加載,搞亂了contentSize()。關於我出錯的地方的想法?

+0

我有這個相同的問題。 – Christian 2010-06-18 22:42:36

+0

我打算在明天檢查我的qt和pyqt版本,看看升級到新版本是否會有所幫助。剛注意到這兩個最近的補丁。 https://bugs.webkit.org/show_bug.cgi?id=36662 https://bugs.webkit.org/show_bug.cgi?id=36798 – Nathan 2010-06-27 04:48:02

回答

0

一個選項是在加載頁面之前設置一個理智的首選大小爲QWebPage.setPreferredContentsSize()。這樣你的框架大小將永遠是首選的大小。 (這也將使一些頁面以更合理的方式呈現,而不是使用非常小的寬度)

否則,您需要遍歷所有子幀並自行計算主框架大小,這可能會變得非常複雜,並且可能會或可能無法正常工作。