无法在同一个应用程序中使用QWebPage两次

时间:2011-02-02 15:54:58

标签: python qt qt4 pyqt4 qtwebkit

我正在尝试创建一个小型Web服务器,使用webkit加载一个URL,从网页中提取一些数据(例如:标题,图像大小......)。

我正在使用PyQt4从python访问webkit。对于每个请求,我正在创建一个QThread: - 创建一个QWebPage对象, - 运行事件循环 - 当网页加载完成后(loadFinished信号),一些代码从QWebPage的mainFrame中提取数据并杀死QThread

第一次加载网页时,这非常有效,包括所有资源(CSS,图像)。 我第二次要求服务器加载网址,网页被加载,但没有任何资源(没有CSS,没有图像)。因此,当我尝试检索图像大小时,所有大小都设置为0,0。

以下是一些代码片段:

# The QThread responsible of loading the WebPage
class WebKitThread(QThread):
    def __init__(self, url):
        QThread.__init__(self)
        self.url = url
        self.start()
    def run(self):
        self.webkitParser = WebKitParser(self.url)
        self.exec_()

class WebKitParser(QWebPage):
    def __init__(self, url, parent=None):
        QWebPage.__init__(self, parent )
        self.loadFinished.connect(self._loadFinished)
        self.mainFrame().load(QUrl(url))

    def _loadFinished(self, result):
        self.computePageProperties()
        QThread.currentThread().exit()

    def computePageProperties(self):
        # Some custom code that reads title, image size...
        self.computedTitle=XXXXXXXX

调用代码(响应HTTP请求)正在执行:

t = WebKitThread(url)
t.wait()
# do some stuff with properties of WebKitParser
print t.webkitParser.computedTitle

1 个答案:

答案 0 :(得分:2)

我设法解决了这个问题:在GUI线程中创建QWebPage(QApplication事件循环的线程)解决了这个问题。

似乎第二次使用QWebPage时,它会尝试访问浏览器缓存(即使它已被配置禁用)。但是如果没有在主GUI线程中创建第一个QWebPage,则缓存有些配置错误且无法使用。

要在主GUI线程中创建QWebPage,我正在使用一个自定义QEvent(类型为User的QEvent)来触发QWebPage初始化和结果获取。