3

我需要创建自己的编解码器,即QTextCodec. 而且我想通过QTextCodec::codecForName("myname");
但是,仅子类是不够的。QTextCodec::availableCodecs()不包含我的编解码器名称。

QTextCodec 文档不涵盖自定义编解码器的正确注册区域:

创建自己的编解码器类

可以通过创建 QTextCodec 子类向 Qt 添加对新文本编码的支持。

纯虚函数向系统描述编码器,编码器根据需要在QTextStream支持的不同文本文件格式中使用,在X11下,用于特定语言环境的字符输入和输出。

要为 Qt 添加对另一种编码的支持,请创建 QTextCodec 的子类并实现下表中列出的功能。
name()
别名()
mibEnum()
convertToUnicode()
convertFromUnicode()

您可能会发现将编解码器类作为插件提供更方便;有关详细信息,请参阅如何创建 Qt 插件。

所以,我试图深入挖掘插件的方向。但我不想有一个带有插件的单独项目。是否可以在同一个项目中声明插件?

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

4

1 回答 1

5

根据 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';
}

QTextCodec::availableCodecs 返回:

"MyNewCodec"
"System"
"roman8" "hp-roman8"
"csHPRoman8" ...

QTextCodec::codecForName 返回了一个指向我的编解码器类的指针

希望这会有所帮助,问候

于 2009-12-31T19:29:58.013 回答