Qt动态切换语言

    今天学习了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中自动添加了下一个窗口按键的槽声明。

<span style="font-size:18px;">private slots:
    void on_nextpushButton_clicked();//声明按下nextpushButton后实现的功能的槽函数</span>

    接着填充按键的实现函数:在mainwindow.cpp中添加如下代码:

<span style="font-size:18px;">void MainWindow::on_nextpushButton_clicked()
{
    this->hide();//当点击nextpushButton时,隐藏主对话框。
    dialog1->show();//显示对话框
    dialog1->exec();//对话框程序一直启动
    this->show();//当对话框关闭之后,主窗口又显示。
}</span>


    上面便实现了从主窗口切换到子窗口的功能。为了能从子对话框切回到主窗口,我们需要对子对话框中的exit按键添加槽声明和实现函数。

    双击dialog.ui->单击exit->go to slot,在dialog.h中自动添加了按键的槽声明。

<span style="font-size:18px;">private slots:
    void on_pushButton_clicked();//退出dialog</span>

    然后在dialog.cpp中填充槽的实现函数。

<span style="font-size:18px;">void Dialog1::on_pushButton_clicked()
{
    this->close();
}</span>

以上的代码我们就能实现主窗口与子对话框来回切换了。


二、利用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中自动添加了英语按键的槽声明。同样的为其他两个按键添加槽声明。

<span style="font-size:18px;">private slots:
    void on_EnglishpushButton_clicked();//声明英语键功能槽函数

    void on_ChineseJpushButton_clicked();

    void on_FpushButton_clicked();

</span>
    下面在mianwindow.cpp中为这3个槽函数写实现函数,以达到我们要实现单窗口的语言切换功能。 
<span style="font-size:18px;">
//按英文键执行的槽函数
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);

    }

}
</span>
这里还要注意的是,别忘了在mainwindow.cpp开头加上翻译的头文件。

以上完成之后,便能实现在单个界面实现语言切换了,很不容易啊,哈哈哈!运行看效果!
当点击english时:

点击Chinese时:


点击Chinese(F)时



     到这我们能实现单个窗口的语言切换了,但是还没完!,我们以后遇到的界面设计必定会有多个窗口,怎样才能实现多个窗口同步设置语言呢?
    先分析一下思路:当我们再mainwindow的窗口点击英语按键时主窗口语言进行了切换,要使子对话框也切换成英语,那我们的子对话框与英语这个按键必定得有某种联系,即当我按下英语按键的同时(其他语言选择按键也一样的),必定向子对话框发送一个信息,提示自对话框要进行语言切换了。当子对话框收到主窗口的按键发送来的信息后,便在子对话框中执行语言切换的函数实现,完成自对话框的语言切换。
    说白了这个过程就是一个信号发送和接收的过程。下面继续分析:

四、实现多窗口之间的语言切换
    通过上面的分析,这时只要我们在主窗口中定义一个信号,当点击语言选择按键时就发射信号。具体的实现过程如下:
    在mainwindow.h中声明一个信号:
 
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);

    }

}



    以上添加的代码意思就是,当我们点击英语按键时,发射信号参数为0,简体中文信号参数为1,繁体中文信号参数为2。因此当子窗口接收到0,就执行英语切换;1执行中文简体切换;2执行繁体中文切换。

    现在发射信号已经写好了,这样就要到子对话框中去定义接收信号的槽函数了,具体实现如下:
在dialog.h中声明接收信号的槽:

private slots:
    void change_trans(int nType);

然后再在dialog.cpp中填充槽的实现:
//切换对话框的语言
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;
    }

}

实现是一个switch-case语句实现的,当接收到0,就执行英语切换;1执行中文简体切换;2执行繁体中文切换。

以上没有问题之后,便能实现多窗口之间语言切换了。上效果哈哈哈!

点击英语按键

点击简体中文按键:
 

点击繁体中文按键:

   
    以上就是多窗口多语种切换的完整实现过程了,其实就运用到了以下知识点:
    1.多窗口切换。
    2.国际化语种切换
    3.信号和槽的应用。

    我在实践的过程中也遇到了一些问题,非常值得注意:
    1.信号与槽的连接的实现函数应该在什么位置,这里其实并不重要,但是一定要注意发送和接收的指针一定先创建,然后再使用,且要搞清他们之间能否传递信息,然后再连接
    2.当发射信号带参数时,我们在连接函数中也要带参数类型。不然也会报错。
    3.自定义的信号不需要我们去写实现,系统会自定帮我们填充信号的实现,我们要做的就是添加发送信号的指令:emit()函数。


    这个多窗口多语种的过程已经可以让我们做很多的变换了,实现更多的窗口之间的语言切换也就没什么难题了。但是美中不足的是我们进行语言切换之后怎样才能保存下来呢,也就是当我们重启程序时,应当要有保存上次设置的显示功能,这才是完整的实现过程。这篇就不写了,下次有空闲时间继续!


   






     




  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值