从 QIODevice.read() 读取后如何处理数据?

Posted

技术标签:

【中文标题】从 QIODevice.read() 读取后如何处理数据?【英文标题】:How to process data after reading from QIODevice.read()? 【发布时间】:2018-12-10 19:42:22 【问题描述】:

这是我第一次提问,如果有什么不对的地方,请告诉我,我将不胜感激。

我正在使用 QWebEngineUrlSchemeHandler 作为自定义 url,我想使用 QFile 打开一个 javascript 文件进行测试。

首先,如果我只是使用

QFile("ken.js")

窗口可以打开 javascript,但如果我使用自定义 QFile, 从 QIODevice.read() 读取数据后,我不知道如何处理数据。

我想知道在从 QIODevice.read() 读取数据后,我需要做什么才能使窗口可以打开 javascript。

请给我一些建议,谢谢。

这是我的完整代码。

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】:

实际上,如果该类从 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_())

【讨论】:

感谢您的建议。我知道它可以只设置文件名(),并且工作正常。如果我想使用,并在网络上传输数据,是否可以使用QIODevice进行接收? @s105321521 你从 QFile 继承的目标是什么? 我的目标是将音频数据从我的服务器传输到客户端,客户端是一个浏览器,它有一个标签 用于接收数据并播放它。 @s105321521 所以你不应该从 QFile 继承,而是从 QIODevice 我必须根据你的要求实现所有虚拟方法,这与 QWebEngineUrlSchemeHandler 无关。 @s105321521 另一方面,如果我的回答可以帮助您解决您在问题中指出的问题,请不要忘记将其标记为正确,如果您不知道该怎么做查看tour

以上是关于从 QIODevice.read() 读取后如何处理数据?的主要内容,如果未能解决你的问题,请参考以下文章

QIODevice::read : 设备未打开

为啥qt不读取文件

C 磁盘 I/O - 在文件的相同偏移量处读取后写入将使读取吞吐量非常低

如何处理文本文件中两个单词之间没有被我的程序读取为空格的大间隙?

从 PL/SQL 开发人员处读取 XML 文件

JAVA如何暂停运行,等网络恢复后再从上次的断点处继续运行程序?