关于python:无法在同一应用程序中使用qwebpage两次

Unable to use in the same application a QWebPage twice

我正在尝试创建一个小的Web服务器,它使用WebKit,从网页中提取一些数据的URL(例如:标题、图片大小…)。

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

这是第一次非常好地工作,网页被加载,包括所有的资源(CSS,图片)。第二次我要求服务器加载一个URL时,会加载网页,但它没有任何资源(没有CSS,没有图像)。所以当我尝试检索图像大小时,所有大小都设置为0,0。

下面是一些代码截图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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请求)正在执行:

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

我已经设法解决了这个问题:在gui线程(qapplication事件循环的线程)中创建qwebpage可以解决这个问题。

似乎第二次使用Qwebpage时,它试图访问浏览器缓存(即使已被配置禁用)。但是,如果第一个qwebpage不是在主GUI线程中创建的,那么缓存就有点配置错误,不可用。

为了在主GUI线程中创建Qwebpage,我使用了一个定制的QEvent(用户类型的QEvent),它触发Qwebpage初始化和结果获取。