2013-01-31 195 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進行了一些更正。