Qt进修之路(33):国际化(上)
副标题#e#
2D画图部门根基告一段落,还在想下面的部门要写什么,原来打算先说下view-model的相关问题,可是前面看到有伴侣问关于国际化的问题,所以此刻先来说说Qt的国际化吧!
Qt中的国际化的要领有许多,常用的有利用QTextCodec类和利用tr()函数。前者将编码名称写到代码内里,除非你利用Unicode 编码,不然国际化依然是一个问题;后者就不会有这个问题,而且这也是Qt推荐的做法。因此,我们主要来说利用tr()函数的要领举办应用措施的国际化。
我们先来看一个很简朴的MainWindow。为了清楚起见,这里只给出了cpp文件的内容:
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QMenuBar *menuBar = new QMenuBar(this);
QMenu *fileMenu = new QMenu(tr("&File"), menuBar);
QAction *newFile = new QAction(tr("&New..."), fileMenu);
fileMenu->addAction(newFile);
QAction *openFile = new QAction(tr("&Open..."), fileMenu);
fileMenu->addAction(openFile);
menuBar->addMenu(fileMenu);
setMenuBar(menuBar);
connect(openFile, SIGNAL(triggered()), this, SLOT(fileOpen()));
}
MainWindow::~MainWindow()
{
}
void MainWindow::fileOpen()
{
QFileDialog *fileDialog = new QFileDialog(this);
fileDialog->setWindowTitle(tr("Open File"));
fileDialog->setDirectory(".");
if(fileDialog->exec() == QDialog::Accepted) {
QString path = fileDialog->selectedFiles()[0];
QMessageBox::information(NULL, tr("Path"), tr("You selected\n%1").arg(path));
} else {
QMessageBox::information(NULL, tr("Path"), tr("You didn't select any files."));
}
}
这是一个很简朴的类,运行功效想必各人也都很是清楚:就是一个主窗口,上面有一个菜单栏,一个File菜单,内里有两个菜单项:
#p#副标题#e#
之所以把运行图贴出来,是为了各人可以或许看清,在代码中的&标纪录际在界面中显示成为一条下划线,标志出这个菜单可能菜单项的快捷键。凭据代码,当我们点击了Open时,会弹出一个打开文件的对话框:
这里的slot内里的代码在前文中已经具体先容过。也许你会问,为什么要用这种贫苦的写法呢?因为我们曾经说过,利用static函数实际上是直接挪用系统的对话框,而这种结构函数法是Qt本身绘制的。这对我们后头的国际化是有必然的影响的。
好了,都已经筹备好了,下面开始举办国际化。所谓国际化,实际上不只仅是把界面中的各类文字翻译成别的的语言,尚有一些事情是要举办书写方法、钱币等的转换。好比,阿拉伯书写时从右向左的,这些在国际化事情中必需完成。可是在这里,我们只举办最简朴的事情,就是把界面的文字翻译成中文。
首先,我们需要在pro文件中增加一行:
TRANSLATIONS += myapp.ts
myapp.ts是我们需要建设的翻译文件。这个文件的名字是任意的,不外后缀名需要是ts。然后我们打开呼吁提示符,进入到工程地址目次,好比我的是E:\My Documents\Workspace\Qt\MyApp,也就是pro文件地址的文件夹,然后输入呼吁
lupdate MyApp.pro
,假如你呈现的是呼吁不存在,请留意将Qt的bin目次添加到情况变量中。此时,假如更新的数目,说明ts文件建设乐成:
最后一行是说,找到7个需要翻译的原文字,0个已经存在。也就是说,这个文件是新建的。这时你会在工程目次下找到这个myapp.ts文件。也许你会奇怪,为什么这里还会说已存在的数目呢?因为Qt这个东西很智能的可以或许识别出已经存在的文字和修改或新增的文字,这样在今后的事情中就不需要一遍遍反复翻译以前的文字了。这也就是为什么这个东西的名字是“lupdate”的原因,因为它是“update”,而不只仅是生成。
假如你有乐趣的话,可以用记事本打开这个ts文件,这个文件实际上是一个XML文件,布局很清晰。不外,我们要利用专业的翻译东西举办翻译。 Qt提供了一个东西,Qt Linguist,你可以在开始菜单的Qt项下面的Tools中找到。用它可以打开我们的ts文件,然后举办我们的翻译事情:
#p#分页标题#e#
完全翻译完成后生存文件,然后在文件菜单下有个“宣布”。点击这个按钮,工程目次下会有一个myapp.qm文件,这就是我们翻译获得的文件。Qt的qm文件实际上是二进制名目标,因此它颠末尾高度的优化,体积很小。
下面我们要修改main()函数,使之加载这个qm文件:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("myapp.qm");
a.installTranslator(&qtTranslator);
MainWindow w;
w.resize(800, 600);
w.show();
return a.exec();
}
留意,QTranslator类实际是在QtCore下面的。代码照旧很清晰:建设一个QTranslator工具,然后加载qm文件,然后将这个工具安装到QApplication类。好了,此刻大功告成,从头编译后运行下措施吧!
咦?怎么照旧英文的?那边有错误了呢?这里往往令人迷惑,其实,这是由于我们利用load()函数加载qm文件时利用的是相对路径,这样直接 load(“myapp.qm”),其实会在当前编译后的exe地址目次下寻找这个qm文件,所以,只要我们把qm文件同exe放在同一目次下,再次运行:
此刻,这个界面已经是中文了吧!其实,这一小细节已经说明,qm文件其实是动态加载到exe文件中的,而不是直接编译进去的。这一点为我们进动作态切换语言提供了基本。
出处:http://devbean.blog.51cto.com/448512/244689