2013-01-31 134 views
0

我想在我的pyside应用程序中支持自定义协议,但没有成功。到目前为止,我尝试过:Pyside qwebview自定义协议

class MainWindow(QWebView): 
    def __init__(self, parent=None): 
     oldManager = self.page().networkAccessManager() 
     self.page().setNetworkAccessManager(NetworkAccessManager(self, oldManager)) 

#in another file 
class NetworkAccessManager(QNetworkAccessManager): 
    def __init__(self, parent, oldManager): 
     QNetworkAccessManager.__init__(self) 
     self.oldManager = oldManager 
     self.setCache(oldManager.cache()) 
     self.setCookieJar(oldManager.cookieJar()) 
     self.setProxy(oldManager.proxy()) 
     self.setProxyFactory(oldManager.proxyFactory()) 
     print('There') 

    def createRequest(self, operation, request, data): 
     print('And there') 

这导致在windows下有segmentation fault。我看到this

目前不支持在PySide.QtWebKit.QWebPage使用它后更改网络访问管理器。

但我不明白它会在这种情况下使用。在设置网络管理器和分段错误消失后,我尝试设置网页对象。

PS:控制台内没有任何打印语句显示。

回答

1

如果createRequest没有返回它回复的结果。因此,完整的解决方案是:

class MainWindow(QWebView): 
    def __init__(self, parent=None): 
     oldManager = self.page().networkAccessManager() 
     self.setPage(DebugWebPage()) #if you want to set a custom page 
     self.page().setNetworkAccessManager(NetworkAccessManager(self)) 

class NetworkAccessManager(QNetworkAccessManager): 
    def __init__(self, parent): 
     QNetworkAccessManager.__init__(self) 

    def createRequest(self, operation, request, data): 
     if request.url().scheme() != 'page': 
      return QNetworkAccessManager.createRequest(self, operation, request, data) 

     if operation == self.GetOperation: 
      # Handle page:// URLs separately by creating custom 
      # QNetworkReply objects. 
      reply = PageReply(self, request.url(), self.GetOperation) 
      print('here') 
      return reply 
     else: 
      return QNetworkAccessManager.createRequest(self, operation, request, data) 

class PageReply(QNetworkReply): 
    def __init__(self, parent, url, operation): 
     QNetworkReply.__init__(self, parent) 
     self.content = '<html><head><title>Test</title></head><body>This is a test.</body></html>' 
     self.offset = 0 

     self.setHeader(QNetworkRequest.ContentTypeHeader, 'text/html; charset=utf-8') 
     self.setHeader(QNetworkRequest.ContentLengthHeader, len(self.content)) 
     QTimer.singleShot(0, self, SIGNAL('readyRead()')) 
     QTimer.singleShot(0, self, SIGNAL('finished()')) 
     self.open(self.ReadOnly | self.Unbuffered) 
     self.setUrl(url) 

    def abort(self): 
     pass 

    def bytesAvailable(self): 
     return len(self.content) - self.offset + QNetworkReply.bytesAvailable(self) 

    def isSequential(self): 
     return True 

    def readData(self, maxSize): 
     if self.offset < len(self.content): 
      end = min(self.offset + maxSize, len(self.content)) 
      data = self.content[self.offset:end] 
      self.offset = end 
      return data 

注:我真的不知道为什么,但任何错误,而脚本是在网络管理器或分段错误的回复结果。

基于this进行了一些更正。