【问题标题】:QStringDecoder not callable in PySide6QStringDecoder 在 PySide6 中不可调用
【发布时间】:2022-01-18 03:06:30
【问题描述】:

我无法从在我的系统上运行的PySide6 documentation 获取示例。我在 Ubuntu 上运行 PySide-6.2。

toUtf16 = QStringDecoder(QStringConverter.Utf8)
toUtf16('test')

结果:

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

【问题讨论】:

  • 尝试 print(dir(toUtf16)) 看看它有哪些东西。

标签: python string encoding pyside6 qstringdecoder


【解决方案1】:

它看起来像 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 类也有类似的问题。

在 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 类,因为 Python 中已经存在等效功能:

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

请注意,Python 会自动添加 BOM,而 Qt 需要 additional flag 才能获得相同的行为。要在 Python 中获取 Qt 风格的可调用对象,您可以使用 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()(另请参阅:How to convert a QByteArray to a python string)。

【讨论】:

  • 谢谢你能告诉我如何在 Python 中做同样的事情吗?
  • @Aaron 查看我的更新答案。
  • 使用 Python 方法解码实际 QByteArray 时出现错误:TypeError: 'bytes' 对象的描述符 'decode' 不适用于 'PySide6.QtCore.QByteArray' 对象
  • @Aaron 是的,您只需先使用bytes(qtbytearray)qtbytearray.data() 将其转换为python 字节对象。我会相应地更新我的答案。
  • 谢谢它的工作:)
猜你喜欢
  • 2022-06-23
  • 2022-01-02
  • 2021-11-14
  • 2021-09-30
  • 2021-07-17
  • 2023-02-22
  • 2022-12-16
  • 2021-12-20
  • 2022-08-16
相关资源
最近更新 更多