• 10654阅读
  • 19回复

[提问]qt5.0中文乱码问题 [复制链接]

上一主题 下一主题
离线leedee99
 

只看楼主 倒序阅读 楼主  发表于: 2012-12-05
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
源码如下


#include "mainwindow.h"
#include <QtGui>
#include <QApplication>
#include <QWidget>
#include <QSpinBox>
#include <QSlider>
#include <QHBoxLayout>
#include <QTextCodec>
#include <QString>
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);    
QWidget *window = new QWidget;    
QString title = "你好你好吗";  
window->setWindowTitle(title);    
QSpinBox *spinBox = new QSpinBox;  
QSlider *slider = new QSlider(Qt::Horizontal);    
spinBox->setRange(0, 130);    
slider->setRange(0, 130);    
QObject::connect(slider, SIGNAL(valueChanged(int)),  spinBox, SLOT(setValue(int)));    
QObject::connect(spinBox, SIGNAL(valueChanged(int)),  slider, SLOT(setValue(int)));  
spinBox->setValue(35);    
QHBoxLayout *layout = new QHBoxLayout;  
  layout->addWidget(spinBox);  
  layout->addWidget(slider);    
window->setLayout(layout);    
window->show();  
return app.exec();
}


中文“你好你好吗”显示出来的是乱码,请问如何解决?
离线leedee99

只看该作者 1楼 发表于: 2012-12-05
编译的时候不通过

E:\xuexi\qt\layer2\main.cpp:-1: 警告:C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
E:\xuexi\qt\layer2\main.cpp:15: 错误:C2001: 常量中有换行符
离线realfan

只看该作者 2楼 发表于: 2012-12-05
将源码文件保存成UTF8试试


离线roywillow

只看该作者 3楼 发表于: 2012-12-05
不要用中文
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线逸凡
只看该作者 4楼 发表于: 2013-04-02
你的问题解决了吗?我也遇到了,怎么解决的
离线jdwx

只看该作者 5楼 发表于: 2013-04-02
代码里不要写中文。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线逸凡
只看该作者 6楼 发表于: 2013-04-02
那把中文写在哪里?
离线jdwx

只看该作者 7楼 发表于: 2013-04-02
回 6楼(逸凡) 的帖子
Qt 翻译 步骤 语言家
第一步
     生成扩展名为pro的QT工程文件,并在文件中添加需要翻译的文件,并在文件结尾处添加如下代码:
TRANSLATIONS = myprojectname_zh.ts;
第二步
      执行命令lupdate my.pro,生成TS文件,文件中包含要翻译的内容;(见下图:QtCreator可以直接运行这个命令)      
第三步
      利用QT语言学家(linguist)打开刚才生成的TS文件,对需要翻译的字段进行翻译;
第四步
      利用QT语言学家(linguist)文件菜单中的发布命令,生成扩展名为qm的最终翻译文件;(见下图:QtCreator可以直接运行这个命令)
第五步
      在你程序中加载QT的翻译器,添加类似如下代码:
      QTranslator translator( 0 );
translator.load( "my.qm", "." );        
app.installTranslator( &translator );


-------------------------------------------------------------------------------------------------------
第一步
在你的pro里面加入 TRANSLATIONS = myexec_zh.ts

第二步
用lupdate 操作pro 将要翻译的提取到ts文件 命令是 lupdate my.pro

第三步
用 linguist 打开刚才的ts文件,linugist是在qt的bin的目录里面, 是一个界面工 具 打开linguist 后用菜单栏file ->open 打开 相应的ts文件 如刚才myexec_zh.ts 打开后你会看到左边是相应的类 右边的上半部 是相应的类里面tr 里面的内容 所以在程序里面 tr里面的都是e文 到这里就用上了 下半部是你要翻译的语言的相应的东西,就是你输入中文的地方 要注意的就是 那些标点符号 最好还是用e文输入状态的如save as.... 就应该是 另存为.... 而不是 另存为。。。。注意后面的标点的差别,其中绿色的表示翻译好了 ,叹号的表示没有翻译对,交叉的表示没有翻译

第四步
先 用 linguist 菜单保存你翻译好的ts文件,接着用linguist界面工具里面菜单file里面的release...,点击这个就会弹出对话框 提示你 输入 qm文件的文件名,用默认的就可以了。按确定后你会在ts文件所在的目录看到一个qm后缀名的个文件,这就程序翻译器要用到的文件。

第五步,在你的程序里面使用刚才得到的qm文件 方法如下
QTranslator translator( 0 );
translator.load( "myexec_zh.qm", "." );//要跟刚才得到的qm的文件名对应
app.installTranslator( &translator );

切记 在第五步的时候,一定要在界面的前面安装翻译器
举个例子 ,下面的顺序是对的
QTranslator translator( 0 );
translator.load( "french.qm", "." );
app.installTranslator( &translator );
MyWidget m;
app.setMainWidget( &m );
m.show();
下面的顺序就不对,它错在界面出来之后才才安装翻译器
MyWidget m;
app.setMainWidget( &m );
m.show();
QTranslator translator( 0 );
translator.( "myexec_zh.qm", "." );//要跟刚才得到的qm的文件名对应
app.installTranslator( &translator );
他的错误是在界面出来后才安装翻译器,就翻译不到界面里面了 ,
一定要在界面出来之前安装翻译器,最好就是在app后就立刻安装
原文:http://hi.baidu.com/tigerwooz/item/ddb9ac87318fad28100ef38d
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线逸凡
只看该作者 8楼 发表于: 2013-04-02
回 7楼(jdwx) 的帖子
如果是在VS2010里面开发的话,应该怎么弄?
离线dbzhang800

只看该作者 9楼 发表于: 2013-04-02
Re:回 7楼(jdwx) 的帖子
引用第8楼逸凡于2013-04-02 16:29发表的 回 7楼(jdwx) 的帖子 :
如果是在VS2010里面开发的话,应该怎么弄?


如果你没有国际化的需求,

对 Qt5 和 VS2010SP1+ 的搭配来说:

源码保存成带BOM的utf8格式,然后在文件开头添加一行 #pragma execution_character_set("utf-8") 即可
离线逸凡
只看该作者 10楼 发表于: 2013-04-03
回 9楼(dbzhang800) 的帖子
谢谢,用你这种方法解决了~
离线呆呆很呆
只看该作者 11楼 发表于: 2013-04-03
用ts翻译文件
离线neil-wen

只看该作者 12楼 发表于: 2013-08-16
Re:回 6楼(逸凡) 的帖子
引用第7楼jdwx于2013-04-02 16:01发表的 回 6楼(逸凡) 的帖子 :
Qt 翻译 步骤 语言家
第一步
     生成扩展名为pro的QT工程文件,并在文件中添加需要翻译的文件,并在文件结尾处添加如下代码:
TRANSLATIONS = myprojectname_zh.ts;
第二步
.......



版主你好,我按照你的第三、第四步,出来的文件是  HPQ-200M_zh.ts;   HPQ-200M_zh.ts;.qm  

HPQ-200M.pro 文件里面已经加有  TRANSLATIONS = HPQ-200M_zh.ts;
main.cpp  文件里面
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTranslator translator( 0 );
    translator.load( "HPQ-200M_zh.qm", "." );
    a.installTranslator( &translator );

    theApp = new hpq200;
    return a.exec();
}

某 XXX.CPP 文件要用到中文的 部分代码如下
.......................
    QTextCodec *codec = QTextCodec::codecForName("GBK");
    QTextCodec::setCodecForLocale(codec);
.......................
        QLabel *Num1 =new QLabel();
        Num1->setAlignment(Qt::AlignCenter);
        Num1->setStyleSheet("color:#ffffff;font:12pt;");
        Num1->setText(tr("B相"));
        ui->inter_statistical_table->setCellWidget(0,3,Num1);
........................
        QLabel *Num4 =new QLabel();
        Num4->setAlignment(Qt::AlignCenter);
        Num4->setStyleSheet("color:#ffffff;font:12pt;");
        Num4->setText(tr("电压含有率(%)"));
        ui->inter_statistical_table->setCellWidget(1,1,Num4);
..............................
用XML格式打开HPQ-200M_zh.ts文件,里面的代码为
..............................
    <message>
        <location filename="inter_harmonic.cpp" line="217"/>
        <source>B
离线neil-wen

只看该作者 13楼 发表于: 2013-08-16
回 12楼(neil-wen) 的帖子
承接上面的内容
用XML格式打开HPQ-200M_zh.ts文件,里面的代码为
..............................
    <message>
        <location filename="inter_harmonic.cpp" line="217"/>
        <source>B
离线neil-wen

只看该作者 14楼 发表于: 2013-08-16
刚粘的内容断掉了

承接上面的内容
用XML格式打开HPQ-200M_zh.ts文件,里面的代码为
..............................
     <message>
        <location filename="inter_harmonic.cpp" line="217"/>
        <source>B
离线neil-wen

只看该作者 15楼 发表于: 2013-08-16
晕头转向~~  刚粘的内容断掉了   又不行了     乱码部分我用********代替吧

承接上面的内容
用XML格式打开HPQ-200M_zh.ts文件,里面的代码为
..............................
     <message>
        <location filename="inter_harmonic.cpp" line="217"/>
        <source>B******</source>
        <translation type="unfinished"></translation>
    </message>
.........................
    <message>
        <location filename="inter_harmonic.cpp" line="241"/>
        <location filename="inter_harmonic.cpp" line="253"/>
        <location filename="inter_harmonic.cpp" line="265"/>
        <source>******************(%)</source>
        <translation type="unfinished"></translation>
    </message>
.......................
编译成功之后,还会出现乱码!!   请求大神们帮助
离线dbzhang800

只看该作者 16楼 发表于: 2013-08-16
不要用 tr 包裹中文!
离线likezyp

只看该作者 17楼 发表于: 2013-08-16
可以在代码里写中文 ,当然用语言包最好 ,
如果非在代码里写中文 , 看这里 http://thinkz.lofter.com/post/1721fd_75cddd
离线yanghz91

只看该作者 18楼 发表于: 2013-12-07
离线yanghz91

只看该作者 19楼 发表于: 2013-12-07
像QString title = "你好你好吗" ;
就可以用
QString title =codec->toUnicode("你好你好吗")
快速回复
限100 字节
 
上一个 下一个