Пользовательский протокол Pyside qwebview

Я хотел бы поддерживать собственный протокол внутри своего приложения pyside, но безуспешно. До сих пор я пробовал:

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')

Это приводит к segmentation faultпод окнами. Я видел это :

В настоящее время не поддерживается изменение диспетчера доступа к сети после его использования PySide.QtWebKit.QWebPage.

Но я не вижу, где это будет использоваться в этом случае. Я попытался установить объект веб-страницы после настройки сетевого менеджера, и ошибка сегментации исчезла.

PS: ни один из операторов печати не отображается внутри консоли.


person martinqt    schedule 31.01.2013    source источник


Ответы (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

Примечание. Я действительно не знаю, почему, но любая ошибка, когда скрипт находится в сетевом менеджере, или ответ приводит к ошибке сегментации.

На основе этого с некоторыми исправлениями.

person martinqt    schedule 31.01.2013