`
king_tt
  • 浏览: 2124005 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Qt中中文处理的简单方法

 
阅读更多

QT是一套很不错的界面开发库,而且考虑到了跨平台的要求,使用也相对比较容易上手。我也刚刚才学习用QT开发,发现它对中文的处理做的不是很好,或者更贴切的是做的不够智能吧,如果在字符串中输入中文,显示的就会是乱码。

下面就介绍一个简单的方法,让我们的中文正确显示出来,先看一段程序,该程序主要功能就是显示一个窗口,窗口上面的按钮显示中文。

1#include<qapplication.h>
2#include<qpushbutton.h>
3#include<qfont.h>
4#include<qvbox.h>
5#include<qtextcodec.h>
6#include<qstring.h>
7#include<qobject.h>
8intmain(intargc,char**argv)
9{
10QApplicationa(argc,argv);
11
12QVBoxbox;
13box.resize(200,120);
14QPushButtonquit("退出",&box);
15quit.setFont(QFont("Times",18,QFont::Bold));
16 QObject::connect(&quit,SIGNAL(clicked()),&a,SLOT(quit()));
17 a.setMainWidget(&box);
18 box.show();
19returna.exec();
10}

在vc6.0下面编译运行程序之后我们会见到界面如下,但是上面的按钮却是乱码了。


那我们该怎么办呢?别着急,其实方法很简单,主要思路就是给应用设定一个字符集,并且把要显示的字符做适当的转化处理就可以了,说起来好像还有些复杂,但是看看代码你就很快明白了。


1#include<qapplication.h>
2#include<qpushbutton.h>
3#include<qfont.h>
4#include<qvbox.h>
5#include<qtextcodec.h>
6#include<qstring.h>
7#include<qobject.h>
8intmain(intargc,char**argv)
9{
10QApplicationa(argc,argv);
11a.setDefaultCodec(QTextCodec::codecForName("GBK"));
12QVBoxbox;
13box.resize(200,120);
14QPushButtonquit(QObject::tr("退出"),&box);
15quit.setFont(QFont("Times",18,QFont::Bold));
16QObject::connect(&quit,SIGNAL(clicked()),&a,SLOT(quit()));
17a.setMainWidget(&box);
18box.show();
19returna.exec();
20}


在vc6.0下面编译运行程序之后我们会见到界面如下,这个时候就显示正常了。



代码分析:
上面的两段代码基本上是大同小异,没有多大的差别,程序的具体含义这里我不做介绍,只讲一下两段代码的区别,见上例中代码的黄色部分,该部分就是为中文显示所做出的改进。
setDefaultCodec(QTextCodec::codecForName("GBK"));
查阅了qt的函数帮助可知,
setDefaultCodec的作用如下:
void QApplication::setDefaultCodec ( QTextCodec * codec )
设置应用程序的默认编解码器为codec。
如果程序中的文字引用文本不是Latin1编码,这个函数可以用来设置合适的编码。例如,韩国程序员开发的软件在程序中对所有文本可以使用eucKR,这种情况下,main()函数可能看起来像这样:

int main(int argc, char** argv)
{
QApplication app(argc, argv);
... install any additional codecs ...
app.setDefaultCodec( QTextCodec::codecForName("eucKR") );
...
}

注意,这不是用户来选择编码的方式。例如,把一个包含英语字符串的应用程序转换为韩语,所需要做的一切就是对于所有的英语字符串通过tr()传递并且载入翻译文件。有关国际化的详细情况,请参考Qt国际化文档。
注意也有一些Qt内置类为不同的字符串调用tr()。这些字符串使用英语,所以对于完整的翻译,编解码器将被这些字符串需要。


QPushButtonquit(QObject::tr("退出"),&box);
tr()函数的说明如下:
QString QObject::tr ( const char * sourceText, const char * comment ) const
返回sourceText的翻译版本,或者如果没有合适的版本返回sourceText它自己。翻译上下文是comment的QObject(默认为空)。所有使用Q_OBJECT宏的QObject对象有这个函数的重新实现,把子类名作为上下文。
也可以参考trUtf8()、QApplication::translate()和Qt中的国际化。
实例:network/networkprotocol/view.cpp。
QString QObject::trUtf8 ( const char * sourceText, const char * comment ) const
返回sourceText的翻译版本,或者如果没有合适的版本返回QString::fromUtf8(sourceText)。它是另一种tr(sourceText, comment)。
也可以参考tr()和QApplication::translate()。
两个函数的作用一个用来设定字符集一个是用来进行字符串转化,刚好满足了前面提到的思路,事情就是这样的,呵呵,就写到这里,希望对你有用。

分享到:
评论

相关推荐

    Qt编写可换肤的中文双拼输入法运行截图

    13:用法简单极致,只需要在项目中添加输入法界面类(共三个文件frminput.h/frminput.cpp/frminput.ui),然后在main函数中引入头文件#include "frminput.h"后调用frmInput::Instance()-&gt;hide();即可。整个工程都...

    QT编写的可换肤的中文双拼输入法核心类

    13:用法简单极致,只需要在项目中添加输入法界面类(共三个文件frminput.h/frminput.cpp/frminput.ui),然后在main函数中引入头文件#include "frminput.h"后调用frmInput::Instance()-&gt;hide();即可。整个工程都...

    Qt / Qml 中捕获(中文)输入法事件(按下 & 提交)

    最近工作中遇到一个奇怪的问题: 本来想在 TextEdit ( QTextEdit ) 中捕获一下键盘按键按下的事件。 然而,当输入法为英文时( 正常输入字符 ),...为了正确处理这类事件,我简单封装了一个辅助类,效果相当不错。

    QT编写的可换肤的中文双拼输入法可执行文件

    13:用法简单极致,只需要在项目中添加输入法界面类(共三个文件frminput.h/frminput.cpp/frminput.ui),然后在main函数中引入头文件#include "frminput.h"后调用frmInput::Instance()-&gt;hide();即可。整个工程都...

    精通qt4编程(源代码)

    \初级篇 第1章 Qt初步实践 卢传富 建立了第一个较简单的Qt应用程序,在GUI用户界面中显示一行中文。 2 \ 第2章 对话框 \——QDialog 卢传富介绍了Qt的对话框类QDialog,实现了一个自定义的登录对话框,举例说明了Qt...

    精通Qt4编程(第二版)源代码

    \初级篇 第1章 Qt初步实践 卢传富 建立了第一个较简单的Qt应用程序,在GUI用户界面中显示一行中文。 2 \ 第2章 对话框 \——QDialog 卢传富介绍了Qt的对话框类QDialog,实现了一个自定义的登录对话框,举例说明了...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    并在logindlg.cpp 中加入#include &lt;QtGui&gt;的头文件。如果不加这个头文件, QMessageBox 类不可用。 9.这时再执行程序,输入用户名为qt,密码为123456,按登录按钮便能进入主 窗口了,如果输入错了,就会弹出警告...

    Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一、使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦。OpenCV中并没有使用自定义...

    ZendFramework中文文档

    4.2.1. Zend_Cache 工厂方法 4.2.2. 标记纪录 4.2.3. 缓存清理 4.3. Zend_Cache前端 4.3.1. Zend_Cache_Core 4.3.1.1. 简介 4.3.1.2. 可用选项 4.3.1.3. 例子 4.3.2. Zend_Cache_Frontend_Output 4.3.2.1. ...

    x64dbgCHS.zip

    x64dbg中文帮助: x64dbg是一款专业的windows系统下的64位调试器,界面简洁、操作简单,与“OllyDbg”调试工具非常相似,如果之前使用过OllyDbg这款调试工具的朋友,可以直接上手使用。DBG是调试器的调试部分,它...

    UMPlayer(一款出色的开源免费媒体播放器)

    UMPlayer的界面简单直观,支持多国语言(含简体中文)。它还拥有众多的鲜明特性,例如:支持Windows、Linux、Mac等系统,有免安装便携版,可更换皮肤的界面,内置字幕搜索引擎,音频/字幕同步处理,增强的渲染过滤...

    OpenCV-Python-Toturial-中文版.pdf

    而且它简单易学,初学者几个小时就可以基本入门。再加 上 Numpy 和 matplotlib 这两个翅膀, Python 对数据分析的能力不逊于 Matlab。 Python 还被称为是胶水语言,有很多软件都提供了 Python 接 口。尤其是在 linux...

    OpenCV-Python-Toturial-中文版

    而且它简单易学,初学者几个小时就可以基本入门。再加上Numpy 和matplotlib 这两个翅膀,Python 对数据分析的能力不逊于Matlab。Python 还被称为是胶水语言,有很多软件都提供了Python 接口。尤其是在linux 下,可以...

    leetcode中文版-my-awesome-list:收集了很棒的脚本、软件、文章、项目、答案和许多其他我喜欢的东西,有些让我的工作变得轻松

    leetcode中文版我的真棒清单 收集了很棒的脚本、软件、文章、项目、答案和许多其他我喜欢的东西,其中一些让我的工作变得轻松(可能也是你的)。 内容 编程语言 C - 大约 200 行的简单堆内存分配器。 - 用于使用 C、...

    网管教程 从入门到精通软件篇.txt

    如果不能在启动目录(默认为 %systemroot%System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。 Diskpart  创建和删除硬盘...

Global site tag (gtag.js) - Google Analytics