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.partial 或 lambda
:
>>> 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()
(另请参阅: ).
我无法从在我的系统上运行的 PySide6 documentation 中获取示例。我在 Ubuntu.
上 运行 PySide-6.2toUtf16 = 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.partial 或 lambda
:
>>> 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()
(另请参阅: