• 13344阅读
  • 10回复

请教使用setFont,setText显示中文和使用QTranslator显示中文原理上的不同 [复制链接]

上一主题 下一主题
离线forder
 
只看楼主 倒序阅读 楼主  发表于: 2007-12-07
— 本帖被 XChinux 执行加亮操作(2007-12-14) —
刚刚接触QT,概念上有些不清,可能不是个好问题。
使用qt/E-3.3.4  fedora 5。
在中文化的过程中,首先尝试使用QTranslator,在designer里添加控件text选择unifont或者自己添加上的stxihei,code选择unicode。使用lupdate生成翻译文件,使用zhcon(中文控制台)编辑翻译文件为中文,使用lrelease生成.qm文件。
main文件里添加QTranslator相关内容。编译通过后运行### -qws,中文显示为方框。后运行其example文件夹中"i18n -qws zh"同样为方框。怀疑是否自己编译qte过程中没有添加中文支持。

之后,使用下面方法:
在程序设计中,首先指定编码方式以支持中文:

    QTextCodec *code=QTextCodec::codecForName("GBK")

  接着为部件(例如Mywidget)执行 Unicode的转化编码:

    QString uniStr=code -> toUnicode("要显示的中文字符")
    Mywidget-> setFont(QFont("stxihei",20,QFont::Bold))
    Mywidget-> setText(uniStr)
则可以在"### -qws""中显示中文。
自己更偏向于使用方法一,所以希望大侠们援手相助,先谢过。
疑问,方法2的中文显示是否和qte的中文支持无关。
另:方法2只是在编码过程使用的Unicode的转化编码,和应用程序指定的编码方式无关(是不是?)
在工程文件里的CODEC是否用来指定应用程序编译时候的编码。
包括QTextCodec::setCodecForTr()的作用。
版大不吝赐教!!!
离线forder
只看该作者 1楼 发表于: 2007-12-12
问题同上,另附加问题,是否使用示例程序"./i18n -qws -font unifont"可以显示中文就表示编译的QTE可以支持中文了。多谢各位大虾指点
离线shiroki

只看该作者 2楼 发表于: 2007-12-12
前面的显示成方块,一般是字体的问题。
至于你问的translator和setText用的翻译原理,实际上是一样的。 setText底层调用了tr, 再底层调用了QApplication::translate, 都是用qm文件来做翻译的

中文显示涉及两个方面, 一是编码,二是字体。 unicode默认就支持,所以unicode编码的中文, 只要字体包含中文字符就可以显示; 但是不表示gb编码已经包含在qt库里了。
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线forder
只看该作者 3楼 发表于: 2007-12-12
多谢shiroki。之前查了一下资料,总有语焉不详的感觉,亦或是自己概念不清楚。
按照shiroki的意思,qte即使不在编译的过程中指定
#ifndef QT_NO_CODECS
#define QT_NO_CODECS
#endif
仍然是可以使用translate来支持中文的。
不知道我的理解是否正确。
另附上一个简单的中文化程序,在我这里编译一直显示乱码(指定字体unifont),希望大家能帮我找出问题所在
翻译文件tt1_CN.qm
main.cpp: 

#include <qapplication.h>
#include <qpushbutton.h>
#include <qtranslator.h>
#include <qfileinfo.h>
#include <qmessagebox.h>
#include <qtextcodec.h>
int main( int argc, char **argv )
{
    QApplication app( argc, argv );
    static QTranslator *translator = 0;
    QFileInfo fi("tt1_CN.qm");
    if ( !fi.exists() ){
        QMessageBox::warning(0,"File error",
                                QString("Cannot find translation for language zh"));
        return 0;
    }
    translator = new QTranslator(0);
    translator->load(QString("tt1_CN.qm"), "." );

    app.installTranslator( translator );
    QPushButton hello( QPushButton::tr("Hello world!"), 0 );//要翻译的文字一定要用 tr("")
    app.setMainWidget( &hello );
    hello.show();
    return app.exec();
}
离线forder
只看该作者 4楼 发表于: 2007-12-13
据自己理解中文化的过程无非就是首先设定窗口的显示使用unicode方式编码,然后就是载入翻译文件。就应该可以显示中文了。
就代码看,在designer中可以设置窗口字体以及编码方式,是否在程序中这步就可以掠过,翻译文件的载入就是按照上帖中的代码完成的,但一直显示为乱码。
恳请各位提醒中间的错误。
离线shiroki

只看该作者 5楼 发表于: 2007-12-14
翻译文件里的内容如果用linguist来编辑的话,应该默认就存成unicode, 这样是不用经过编码转换就可以显示的。所以注意一下是不是用的中文字体就行了
如果是手动编辑器来编辑,有可能存的文件编码不是unicode, 这样要显示就涉及到编码转换的问题。。这个就比较麻烦了。不知道你这个是什么情况。
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
离线forder
只看该作者 6楼 发表于: 2007-12-14
感谢shiroki,确实是自己的翻译文件的问题,之前用zhcon(一个中文控制台),手动编辑了.ts文件,后来证明就是这个翻译文件的问题,改用linguist或者在窗口环境下就行了。多谢
离线forder
只看该作者 7楼 发表于: 2007-12-14
总结一下:
环境:qte-3.3.4,fedora5.0
使用QTE过程中不需要在.pro文件中添加codec项,也不需要在main中指定编码。只需要使用QTranslator载入翻译文件。翻译文件不可以使用zhcon这个中文控制台编写。
离线youngst

只看该作者 8楼 发表于: 2008-01-16
楼上说法,有点误导人,不是不能用zhcon控制台编写,其他控制台也一样,只是你修改后,文件编码,变成了本地编码,中文一般是GB2312或者GB18030,如果不改文件编码的话,就必须把TS的encoding改GB的编码就可以用了.

还有就setfont 中有个设置setFont(QFont("stxihei",20,QFont::Bold))之类,运行时不需要 加 -font XXX, 没有设置setfont的话,需要加上-font xxx ,还有一定必须保证你设置 字库支持 中文, xxx要和lib/font里的中文字体名字一致,否则就是 框框了
离线polaris
只看该作者 9楼 发表于: 2008-01-28
还是一个问题你们没去搞明白就是,你去setfont也好 -font也好  其实是去做一个setfalimy("unifont ");这个东西就是说你国际化,你内部用什么的Unicode或GB2312或gbk码,只要你的字库支持这些东西!你setfalimy("");是你的字体库!
离线forder
只看该作者 10楼 发表于: 2008-02-20
呵呵,多谢指点
快速回复
限100 字节
 
上一个 下一个