Подкласс QTextCodec - как зарегистрировать мой кодек

Мне нужно создать свой собственный кодек, то есть подкласс QTextCodec, И я хотел бы использовать его через QTextCodec::codecForName("myname");
Однако просто подкласса недостаточно. QTextCodec::availableCodecs() не содержит моего имени кодека.

Документация QTextCodec не охватывает область правильной регистрации пользовательского кодека:

Создание собственного класса кодеков

Поддержка новых текстовых кодировок может быть добавлена ​​в Qt путем создания подклассов QTextCodec.

Чистые виртуальные функции описывают кодировщик системы, и кодер используется в соответствии с требованиями в различных форматах текстовых файлов, поддерживаемых QTextStream, и в X11 для ввода и вывода символов, специфичных для локали.

Чтобы добавить поддержку другой кодировки в Qt, создайте подкласс QTextCodec и реализуйте функции, перечисленные в таблице ниже.
название()
(псевдонимы)
mibEnum ()
convertToUnicode()
convertFromUnicode()

Возможно, вам будет удобнее сделать ваш класс кодека доступным в качестве плагина; смотрите Как создавать плагины Qt для деталей.

Итак, я попытался немного покопаться в направлении плагинов. Но я не хочу иметь отдельный проект с плагином. Можно ли объявить плагин в рамках одного проекта?

Или есть прямой способ регистрации моего кодека в QTextCodec? Это предпочтительнее.

1 ответ

Решение

Согласно 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"
"Система"
"roman8" "hp-roman8"
"csHPRoman8"...

QTextCodec:: codecForName вернул указатель на мой класс кодеков

надеюсь, что это помогает, привет

Другие вопросы по тегам