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初始化和结果获取。