2009-12-31 18 views
1

我需要創建我自己的編解碼器,即QTextCodec的子類。我想通過QTextCodec::codecForName("myname");
使用它但是,只是子類是不夠的。 QTextCodec::availableCodecs()不包含我的編解碼器名稱。QTextCodec子類 - 如何註冊我的編解碼器

QTextCodec來文檔不包括自定義的編解碼器的正確註冊的區域:

創建自己的編解碼器類

支持新文本編碼可以 加入Qt的創建QTextCodec來 小類。

的純虛函數描述 編碼器向系統和如在 不同的文本文件格式要求QTextStream支持 使用 編碼器,並且X11下,對於 語言環境特定字符輸入和 輸出。

要爲其他編碼的支持加入 的Qt,使QTextCodec來的子類, 實現在 下表中列出的功能。
名()
別名()
mibEnum()
convertToUnicode()
convertFromUnicode()

您可能會發現更方便 使可作爲 插件你的解碼器類;有關詳細信息,請參閱如何創建Qt插件 。

所以,我試圖挖掘一點插入方向。但我不想與插件有單獨的項目。是否有可能在同一個項目中聲明插件?

還是有直接的方式註冊我的編解碼器到QTextCodec?這是可取的。

回答

3

根據qtextcodex.cpp通過自己的構造函數將任何新的編解碼器添加到已註冊編解碼器集合(* static QList 全部)。因此,創建一個你的編解碼器類的實例應該可以做到這一點。下面的代碼工作對我罰款:

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返回一個指向我的編解碼器類的指針

希望這會有所幫助,關於

+0

謝謝,你說得對!我的編解碼器的構造函數沒有調用繼承的QTextCodec的構造函數。這就是爲什麼我的編解碼器沒有註冊。我應該看看Qt的來源。 – 2010-01-02 09:14:16

+2

@serge_gubenko:我不知道規範是否已經改變,或者在你寫這個答案時錯過了這個規範,但是QTextCodecs必須在堆上創建並且從不明確刪除。這可以在我的Qt 4.8.3源代碼974行的QTecodeCodec的QTextCodec ::〜QTextCodec實現中看到。'QTextCodec應始終在堆上構建(即使用\ c 新建)。 Qt取得所有權,並在應用程序 終止時將其刪除。# – Kivin 2013-04-16 03:25:05

+0

@Kivin您是對的:在退出應用程序時,不使用新的導致對非指針的刪除調用 – 2013-06-18 07:13:01

相關問題