Как обрабатывать данные после чтения из QIODevice.read ()? - PullRequest
0 голосов
/ 10 декабря 2018

Я впервые задаю вопрос, если что-то не так, пожалуйста, скажите мне, я буду признателен.

Я использую QWebEngineUrlSchemeHandler для пользовательского URL-адреса и хочу использовать QFileоткрыть файл javascript для тестирования.

Во-первых, если я просто использую

QFile("ken.js")

Окно может открыть JavaScript, но если я использую свой собственный QFile, я понятия не имею, какобработать данные после того, как я прочитал из QIODevice.read ().

Я хочу знать, что мне нужно сделать, чтобы окно могло открыть JavaScript после того, как я прочитал данные из QIODevice.read ().

Пожалуйста, дайте мне несколько советов, спасибо.

Вот мой полный код.

class TestQFile(QtCore.QFile):
    def __init__(self, fileName):
        super().__init__()
        self.setFileName(fileName)
        self.open(self.ReadOnly)

        self.data = b''

        while True:
            receivedData = self.read(10)
            self.data += receivedData
            if receivedData == b'':
                break

class TestHandler(QWebEngineUrlSchemeHandler):
    def requestStarted(self, request):
        self._dev = TestQFile("ken.js")
        request.reply(b'text/javascript', self._dev)


class TestWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._view = QWebEngineView(self)
        self._handler = TestHandler() # Must keep ref
        self._view.page().profile().installUrlSchemeHandler(b'myuri', self._handler)
        self._view.setHtml('<html><head><title>Test</title></head><body><div id="d1"></div><script src="myuri://test/ken.js"></script></body></html>')
        self.setCentralWidget(self._view)
        self.show()
        self.raise_()

if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    win = TestWindow()
    app.exec_()

1 Ответ

0 голосов
/ 10 декабря 2018

На самом деле, если класс наследует от QFile, вам не нужно ничего делать, поскольку он уже реализовал методы, требуемые QWebEngineUrlRequestJob, поскольку он будет использовать методы, которые каждый класс, наследующий от QIODevice, должен реализовывать как readData (), writeData (), atEnd () и т. д.

from PyQt5 import QtCore, QtWidgets, QtWebEngineCore,QtWebEngineWidgets

class TestQFile(QtCore.QFile):
    def __init__(self, fileName):
        super().__init__()
        self.setFileName(fileName)

class TestHandler(QtWebEngineCore.QWebEngineUrlSchemeHandler):
    def requestStarted(self, request):
        self.file = TestQFile("ken.js")
        request.reply(b'text/javascript', self.file)

class TestWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self._view = QtWebEngineWidgets.QWebEngineView(self)
        self._handler = TestHandler() # Must keep ref
        self._view.page().profile().installUrlSchemeHandler(b'myuri', self._handler)
        self._view.setHtml('<html><head><title>Test</title></head><body><div id="d1"></div><script src="myuri://test/ken.js"></script></body></html>')
        self.setCentralWidget(self._view)
        self.show()
        self.raise_()

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win = TestWindow()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...