pythonpyqtpyqt5qiodevice

How to process data after reading from QIODevice.read()?


This is my first time to ask question, if there are something I get wrong, please tell me, I will be appreciate.

I am using QWebEngineUrlSchemeHandler for a custom url, and I want to use QFile to open a javascript file for testing.

First, if I just use

QFile("ken.js")

The window could open the javascript, but if I use my custom QFile, I have no idea how to process the data after I read from QIODevice.read().

I want to know what I need to do to make the window could open the javascript after I read the data from QIODevice.read().

Please give me some suggests, thank.

Here is my full code.

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_()

Solution

  • Actually if the class inherits from QFile you do not have to do anything since it already has implemented the methods that QWebEngineUrlRequestJob requires since it will use the methods that every class that inherits from QIODevice must implement as readData(), writeData(), atEnd(), etc.

    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_())