QStringDecoder 在 PySide6 中不可调用

QStringDecoder not callable in PySide6

我无法从在我的系统上运行的 PySide6 documentation 中获取示例。我在 Ubuntu.

上 运行 PySide-6.2
toUtf16 = QStringDecoder(QStringConverter.Utf8)
toUtf16('test')

结果:

TypeError: 'PySide6.QtCore.QStringDecoder' object is not callable

这看起来像是 PySide6 中的错误。返回的对象只有从 QStringConverter 继承的方法,使用 dir:

可以看出
>>> dec = QtCore.QStringDecoder(QtCore.QStringConverter.Encoding.Utf16)
>>> for x in dir(dec):
...     if x[0].islower(): print(x)
...
hasError
isValid
name
nameForEncoding
requiredSpace
resetState
state

所以 decode methods 丢失了,TypeError 表示 ()-operator 重载也丢失了。 QStringEncoder class 也有类似的问题。

在 PyQt6 中,一切正常:

>>> enc = QtCore.QStringEncoder(QtCore.QStringConverter.Encoding.Utf16)
>>> dec = QtCore.QStringDecoder(QtCore.QStringConverter.Encoding.Utf16)
>>> x = enc('text')
>>> x
PyQt6.QtCore.QByteArray(b't\x00e\x00x\x00t\x00')
>>> dec(x)
'text'

当然,您并不真的需要使用这些 Qt classes,因为等价的功能已经存在于 Python:

>>> x = 'text'.encode('utf-16')
>>> x
b'\xff\xfet\x00e\x00x\x00t\x00'
>>> x.decode('utf-16')
'text'

请注意 Python 会自动添加 BOM, whereas Qt requires an additional flag to get the same behaviour. To get a Qt-style callable object in Python, you can either use functools.partiallambda:

>>> from functools import partial
>>> enc = partial(str.encode, encoding='utf-16')
>>> # or enc = lambda s: s.encode('utf-16')
>>> dec = partial(bytes.decode, encoding='utf-16')
>>> # or dec = lambda b: b.decode('utf-16')
>>> x = enc('text')
b'\xff\xfet\x00e\x00x\x00t\x00'
>>> dec(x)
'text'

注意:要将 QByteArray 转换为 Python bytes 对象,请使用 bytes(qtbytearray)qtbytearray.data()(另请参阅: ).