今天学习了Qt国际化相关的内容,国际化无非就是使我们做出来的界面能够实现多语种切换的功能。今天在学习的过程中也看了不少同仁的博文,汲取了不少经验。唯一不足的是很少有博文中详细的介绍如何进行多窗口之间多种语言来回切换的,大都是简单的描述如何在单一的窗口实现语种切换的功能。然而我们再实际项目中大都是多窗体的界面,多语种切换要能实现多窗口之前的语种切换。因此进过今天曲折的学习,将我在实例中是如何实现多语种随意切换的详细过程记录下来,算是对今天学习的总结,也算是集思广益之后的回馈!
简单的描述一下本实例的功能:有两个窗口(下图所示),一个mainwindow(主)和一个Dialog(子)窗口,主窗口上有三种语言选择按键:英语、简体中文和繁体中文。当点击主窗口中的语言切换按钮时,主窗口和子窗口中的语言全部切换成所选按键指示的语言。
好了,下面是本实例的完整过程:
一、实现主窗口与对话框的联系
首先,新建一个主工程test9(这个是我第9个例子),类名为MainWindow,基类为QMainWindow。然后添加一个Qt Designer Form Class(新建->Qt->Qt Designer Form Class->Dialog without Buttons->Dialog)。
添加标签和按键
界面文件中的dialog.ui和mainwindow.ui文件,添加图中所示的标签和按键,并分别设置好名称。
建立主窗口与对话框的联系
主窗口与子窗口联系效果:当我们点击主窗口中的next dialog按钮时,主窗口隐藏,子对话框显示,进入子窗口后点击子窗口中的exit按键,自对话框关闭,同时主窗口显示。
添加next dialog的槽声明,单击按键next dialog->go to slot,这样在mainwindow.h中自动添加了下一个窗口按键的槽声明。
private slots:
void on_nextpushButton_clicked();//声明按下nextpushButton后实现的功能的槽函数
接着填充按键的实现函数:在mainwindow.cpp中添加如下代码:
void MainWindow::on_nextpushButton_clicked()
{
this->hide();//当点击nextpushButton时,隐藏主对话框。
dialog1->show();//显示对话框
dialog1->exec();//对话框程序一直启动
this->show();//当对话框关闭之后,主窗口又显示。
}
上面便实现了从主窗口切换到子窗口的功能。为了能从子对话框切回到主窗口,我们需要对子对话框中的exit按键添加槽声明和实现函数。
双击dialog.ui->单击exit->go to slot,在dialog.h中自动添加了按键的槽声明。
private slots:
void on_pushButton_clicked();//退出dialog
然后在dialog.cpp中填充槽的实现函数。
void Dialog1::on_pushButton_clicked()
{
this->close();
}
以上的代码我们就能实现主窗口与子对话框来回切换了。
二、利用Qt linguist工具翻译应用程序
翻译的过程主要分为三个步骤:
第一步:修改项目文件。利用lupdate工具生成.ts文件。
在test9.pro文件的最后一行添加如下代码,保存之后,利用lupdate工具生成.ts文件。
TRANSLATIONS = test9_zh_CN.ts
然后涉及到使用lupdata工具生成.ts文件,详细的就不介绍了,这里着重注意的是lupdata的路径,不能填错了。
第二步:利用linguist工具翻译.ts文件中的内容。
由第一步生成的.ts文件,利用linguist工具对项目进行翻译。
第三步:利用lrelease工具从.ts文件中获得.qm文件。这个.qm文件便是以后可用的,能够实现翻译的二进制文件。
需要注意的是.ts和.qm文件不依赖与开发平台,也就是说我们再Windows上得到的.ts和.qm文件在linux系统也能使用。
三、实现单个窗口多语种切换。
为了能够点击主窗口中的按键便能实现语言的切换,我们就得先为个按键声明槽函数,并填充函数的声明。
双击mainwindow.ui文件,单击english->go to slot,这样在mainwindow.h中自动添加了英语按键的槽声明。同样的为其他两个按键添加槽声明。
private slots:
void on_EnglishpushButton_clicked();//声明英语键功能槽函数
void on_ChineseJpushButton_clicked();
void on_FpushButton_clicked();
//按英文键执行的槽函数
void MainWindow::on_EnglishpushButton_clicked()
{
//以下是用于实现语言的切换
QTranslator translator;
bool b = false;
b = translator.load("F:/QTstudies/test9/test9_am_EH.qm");
if(b==1)//当b为1时,表示成功加载语言文件
{
//为应用程序安装翻译
qApp->installTranslator(&translator);
//刷新翻译
this->ui->retranslateUi(this);
}
}
//按中文简体键执行的槽函数
void MainWindow::on_ChineseJpushButton_clicked()
{
QTranslator translator;
bool b = false;
b = translator.load("F:/QTstudies/test9/test9_zh_CN.qm");
if(b==1)//当b为1时,表示成功加载语言文件
{
qApp->installTranslator(&translator);
this->ui->retranslateUi(this);
}
}
//按中文繁体键执行的槽函数
void MainWindow::on_FpushButton_clicked()
{
QTranslator translator;
bool b = false;
b = translator.load("F:/QTstudies/test9/test9_zh_CNF.qm");
if(b==1)//当b为1时,表示成功加载语言文件
{
qApp->installTranslator(&translator);
this->ui->retranslateUi(this);
}
}
private :signals:
void languagechange(int nType);
//按英文键执行的槽函数
void MainWindow::on_EnglishpushButton_clicked()
{
emit languagechange(0);
//连接信号和槽函数,实现改变dialog1中各部件显示的语言
connect(this,SIGNAL(languagechange(int)),dialog1,SLOT(change_trans(int)));
//以下是用于实现语言的切换
QTranslator translator;
bool b = false;
b = translator.load("F:/QTstudies/test9/test9_am_EH.qm");
if(b==1)//当b为1时,表示成功加载语言文件
{
//为应用程序安装翻译
qApp->installTranslator(&translator);
//刷新翻译
this->ui->retranslateUi(this);
}
}
//按中文简体键执行的槽函数
void MainWindow::on_ChineseJpushButton_clicked()
{
emit languagechange(1);
connect(this,SIGNAL(languagechange(int)),dialog1,SLOT(change_trans(int)));
QTranslator translator;
bool b = false;
b = translator.load("F:/QTstudies/test9/test9_zh_CN.qm");
if(b==1)//当b为1时,表示成功加载语言文件
{
qApp->installTranslator(&translator);
this->ui->retranslateUi(this);
}
}
//按中文繁体键执行的槽函数
void MainWindow::on_FpushButton_clicked()
{
emit languagechange(2);
connect(this,SIGNAL(languagechange(int)),dialog1,SLOT(change_trans(int)));
QTranslator translator;
bool b = false;
b = translator.load("F:/QTstudies/test9/test9_zh_CNF.qm");
if(b==1)//当b为1时,表示成功加载语言文件
{
qApp->installTranslator(&translator);
this->ui->retranslateUi(this);
}
}
private slots:
void change_trans(int nType);
//切换对话框的语言
void Dialog1::change_trans(int nType)
{
//根据主窗口中传来的信号,来确定对话框中使用哪种语言
switch(nType)
{
//英文
case 0:
{
QTranslator translator;
bool b = false;
b = translator.load("F:/QTstudies/test9/test9_am_EH.qm");
if(b==1)
{
qApp->installTranslator(&translator);
this->ui->retranslateUi(this);
}
}
break;
//简体中文
case 1:
{
QTranslator translator;
bool b = false;
b = translator.load("F:/QTstudies/test9/test9_zh_CN.qm");
if(b==1)
{
qApp->installTranslator(&translator);
this->ui->retranslateUi(this);
}
}
break;
//繁体中文
case 2:
{
QTranslator translator;
bool b = false;
b = translator.load("F:/QTstudies/test9/test9_zh_CNF.qm");
if(b==1)
{
qApp->installTranslator(&translator);
this->ui->retranslateUi(this);
}
}
break;
}
}