首页 > 解决方案 > PyQt5:继承 QTextCodec

问题描述

我在 PyQt5(特别是 5.9.2,使用 Python 3.7)中创建 QTextCodec 的子类时遇到问题。

我创建了一个 MWE 来演示这个问题。运行以下代码:

# -*- coding: utf-8 -*-

from PyQt5.QtCore import QTextCodec

class MyCodec(QTextCodec):
    def __init__(self):
        super().__init__()
        self.inner_codec = QTextCodec.codecForName('UTF-8')

    def name(self):
        return b'My' + self.inner_codec.name()

    def aliases(self):
        return [b'My' + alias for alias in self.inner_codec.aliases()]

    def mibEnum(self):
        return self.inner_codec.mibEnum()

    def convertFromUnicode(self, input, number, state):
        return self.inner_codec.convertFromUnicode(input, number, state)

    def convertToUnicode(self, chars, len, state):
        return self.inner_codec.convertToUnicode(chars, len, state)

if __name__ == '__main__':
    def main():
        codec = QTextCodec.codecForName('MyUTF-8')
        assert codec is None # MyUTF-8 not found!

        mycodec = MyCodec() # error here
        print(mycodec.fromUnicode('hello world!'))

    main()

产生错误

TypeError: PyQt5.QtCore.QTextCodec cannot be instantiated or sub-classed

QTextCodecs 显然是一种特殊的野兽,Qt 对其创作拥有所有权。但是,根据这个StackOverflow 答案,它们确实需要实例化才能注册。Jesse Hallam 对该答案的评论指出,在 C++ 中,编解码器必须用new;实例化。但是 Python 并没有真正完成整个“堆栈”和“堆”的事情。

我应该如何进行?

标签: pythonpyqt5

解决方案


推荐阅读