QTextCodec子类-如何注册我的编解码器

QTextCodec子类-如何注册我的编解码器,qt,encoding,plugins,character-encoding,codec,Qt,Encoding,Plugins,Character Encoding,Codec,我需要创建自己的编解码器,即QTextCodec的子类。我想通过QTextCodec::codeforname(“myname”)使用它 然而,仅仅使用子类是不够的QTextCodec::availableCodecs()不包含我的编解码器名称 QTextCodec文档不包括自定义编解码器的正确注册: 创建自己的编解码器类 支持新的文本编码 通过创建QTextCodec添加到Qt 子类 纯虚函数描述 将编码器连接到系统和 编码器是按照本规范的要求使用的 支持不同的文本文件格式 通过QTextSt

我需要创建自己的编解码器,即
QTextCodec
的子类。我想通过
QTextCodec::codeforname(“myname”)使用它
然而,仅仅使用子类是不够的
QTextCodec::availableCodecs()
不包含我的编解码器名称

QTextCodec文档不包括自定义编解码器的正确注册:

创建自己的编解码器类

支持新的文本编码 通过创建QTextCodec添加到Qt 子类

纯虚函数描述 将编码器连接到系统和 编码器是按照本规范的要求使用的 支持不同的文本文件格式 通过QTextStream,并在X11下 特定于区域设置的字符输入和 输出

将对其他编码的支持添加到 Qt,创建QTextCodec和 执行中列出的功能 下表。
name()
别名()
mibEnum()
convertToUnicode()
convertFromUnicode()

你可能会发现 使您的编解码器类作为 插件;查看如何创建Qt插件 详情请参阅

所以,我试着深入了解一下插件的发展方向。但我不想有一个单独的项目与插件。是否可以在同一个项目中声明插件


或者有没有直接的方法将我的编解码器注册到QTextCodec?这是最好的。

根据qtextcodex.cpp,任何新的编解码器都由其自己的构造函数添加到已注册编解码器的集合(*static QList all)。因此,创建编解码器类的实例应该可以做到这一点;下面的代码对我来说很好:

QMyCodec myCodec;

foreach (QByteArray codecName,  QTextCodec::availableCodecs())
{
    QString codecNameStr(codecName);
    qDebug() << codecNameStr;
}

QTextCodec* codec = QTextCodec::codecForName("MyNewCodec");
if (codec)
{
    qDebug() << "found ";
    qDebug() << codec->name() << '\n';
}
QMyCodec-myCodec;
foreach(QByteArray编解码器名称,QTextCodec::availableCodecs())
{
QString codecNameStr(codecName);

qDebug()谢谢,你说得对!我的编解码器的构造函数没有调用继承的QTextCodec的构造函数。这就是我的编解码器没有注册的原因。我应该看看Qt源代码。@serge_gubenko:我不知道在编写此答案时规范是否已更改,或者是否遗漏了此选项,但QTextCodec必须在堆上创建,并且从不显式删除。这可以在QTextCodec上看到::~QTextCodec实现QTextCodec.cpp,在我的Qt 4.8.3源代码第974行。
QTextCodec应始终在堆上构造(即使用\c new).Qt拥有所有权,并将在应用程序终止时将其删除。
@Kivin你说得对:退出应用程序时,不使用新的线索导致对非指针的删除调用