如何在PyQt5中使用QDataStream读取QVector?
解决PyQt5中QtDataStream读取QVector的问题
PyQt5确实没有提供QVector类的绑定,因为Python原生列表已经可以完全替代它的功能。要读取QtDataStream中的QVector数据,你可以根据存储的元素类型手动读取——QVector在序列化时的格式是先存储元素个数(quint32类型),再依次存储每个元素。
针对基础类型的QVector(如QVector、QVector等)
直接读取元素个数后循环读取每个元素,存入Python列表:
from PyQt5 import QtCore path = "your_file_path.dat" infile = QtCore.QFile(path) if not infile.open(QtCore.QIODevice.ReadOnly): raise IOError(infile.errorString()) stream = QtCore.QDataStream(infile) # 读取QVector的元素个数 vec_size = QtCore.quint32() stream >> vec_size # 循环读取每个元素,以int类型为例 result_list = [] for _ in range(vec_size): elem = int() stream >> elem result_list.append(elem) # 如果是QString类型,替换成如下读取方式 # for _ in range(vec_size): # elem = QtCore.QString() # stream >> elem # result_list.append(str(elem))
针对自定义类型的QVector
如果QVector存储的是自定义C类型,需要先确保该类型已经通过qRegisterMetaType注册,并且在C端实现了QDataStream的operator<<和operator>>重载。之后在Python中同样按“读大小+循环读元素”的方式处理:
# 假设自定义类型为MyCustomType,已在PyQt中绑定 from PyQt5 import QtCore from your_module import MyCustomType infile = QtCore.QFile(path) if not infile.open(QtCore.QIODevice.ReadOnly): raise IOError(infile.errorString()) stream = QtCore.QDataStream(infile) vec_size = QtCore.quint32() stream >> vec_size result_list = [] for _ in range(vec_size): elem = MyCustomType() stream >> elem result_list.append(elem)
补充说明
Qt的Python绑定中,大部分Qt容器类都会映射到Python原生类型(比如QList对应Python列表),QVector因为和QList功能重叠,且Python列表更易用,所以没有单独提供绑定。只要遵循QtDataStream的序列化格式,就能轻松将QVector的数据读取到Python列表中。
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

