我想在我的pyside app中支持自定义协议,但没有成功。到目前为止我试过了:
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:控制台内没有显示任何print语句。
答案 0 :(得分: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进行一些修正。