QT中英文切换

要想实现动态切换语言,必须掌握动态切换语言的原理。

原理其实就是把显示的语言文字做成不同的字库文件,然后在程序中动态的加载字库文件而已。比如说我要中文显示,那么我就先做一个中文字库文件,然后在程序中将这个中文字库文件加载到程序中,前提是这个文件必须包括你要显示的文字的全部,要不然有些文字就不能正确显示。

那么现在有几个问题需要思考:1.怎么制作这个字库文件?2.怎样加载这个文件?3.怎样实现动态切换?

1.怎么制作这个字库文件?

1)加标识。在需要被翻译的字符串前面标识tr,如QString str=tr(“hello,world!”); ,这很重要,因为翻译工具会把源码中tr标识的字符串提取出来,翻译成其他语言,如果没有用tr标识的,不会被工具提取。在界面中输入的文字,默认已经是加上tr的了,所以在翻译时也能看见。建议:在程序中的字符串使用英文,汉语等通过多国语翻译来实现,而不要采取把汉字写在代码中。

  2)提取翻译源文件.ts。在命令行下调用: lupdate myproject.pro,生成.ts文件.

  3)翻译文件。启动Qt Linguist进行翻译.

  4)发布字库文件.qm。在命令行下调用:lrelease myproject.pro,生成.qm文件或者点击Qt Linguist的文件->发布

  2.怎样加载这个文件?

  1. <span style="font-size: 18px;"> QTranslator *translator = new QTranslator(app);     
  2.     translator->load(QString("./language/zh_CN","." ));  // 会在当前目录下的language目录下寻找,可以不带".qm"后缀名   
  3.     app->installTranslator( translator );                // 安装翻译器</span> 
<span style="font-size:18px;"> QTranslator *translator = new QTranslator(app);    
    translator->load(QString("./language/zh_CN","." ));  // 会在当前目录下的language目录下寻找,可以不带".qm"后缀名  
    app->installTranslator( translator );                // 安装翻译器</span>

  3.怎样实现动态切换?

  我完成以上两步之后采用信号-槽机制来进行加载文件,但是就是不能动态改变语言。后来在网上找到一点提示:在系统调用完installTranslator函数之后,程序当中所有的QWidget以及其子类都会接受到QEvent::LanguageChange()信号。基于此,我就在QWidget类中编写了接受QEvent::LanguageChange()信号的函数,这样就实现了动态的切换。由于基于Ui创建的QWidget类自动会生成一个刷新语言的函数,所以这样就有两种情况:

  1)使用UI编辑器来自动生成界面的情况。

  1. <span style="font-size: 18px;"> connect(ui->china_rabtn,SIGNAL(toggled(bool)),this,SLOT(languageChina())); 
  2.      connect(ui->engsh_rabtn,SIGNAL(toggled(bool)),this,SLOT(languageEnglish())); 
  3. </span> 
<span style="font-size:18px;"> connect(ui->china_rabtn,SIGNAL(toggled(bool)),this,SLOT(languageChina()));
     connect(ui->engsh_rabtn,SIGNAL(toggled(bool)),this,SLOT(languageEnglish()));
</span>
  1. <span style="font-size: 18px;">void language::changeEvent(QEvent *e)//自动生成的代码 
  2.     QWidget::changeEvent(e); 
  3.     switch (e->type())  { 
  4.     case QEvent::LanguageChange://就是这个信号 
  5.         ui->retranslateUi(this);//在此处刷新语言的 
  6.         break
  7.     default
  8.         break
  9.     } 
  10.  
  11. void language::languageChina()//自己编写<span style="font-family: Arial;">的槽函数</span> 
  12.     translator.load("zh_CN","."); 
  13.     qApp->installTranslator(&translator); 
  14.  
  15. void language::languageEnglish()//自己编写的槽函数 
  16.     qApp->removeTranslator(&translator); 
  17. </span> 
<span style="font-size:18px;">void language::changeEvent(QEvent *e)//自动生成的代码
{
    QWidget::changeEvent(e);
    switch (e->type())  {
    case QEvent::LanguageChange://就是这个信号
        ui->retranslateUi(this);//在此处刷新语言的
        break;
    default:
        break;
    }
}

void language::languageChina()//自己编写<span style="font-family:Arial;">的槽函数</span>
{
    translator.load("zh_CN",".");
    qApp->installTranslator(&translator);
}

void language::languageEnglish()//自己编写的槽函数
{
    qApp->removeTranslator(&translator);
}
</span>
  1. <span style="font-size: 18px;"> void retranslateUi(QWidget *language)//这个也是自动生成的代码 
  2.     { 
  3.         language->setWindowTitle(QApplication::translate("language", "Form", 0, QApplication::UnicodeUTF8)); 
  4.         china_rabtn->setText(QApplication::translate("language", "        \347\256\200\344\275\223\344\270\255\346\226\207", 0, QApplication::UnicodeUTF8)); 
  5.         engsh_rabtn->setText(QApplication::translate("language", "         English", 0, QApplication::UnicodeUTF8)); 
  6.         sav_btn->setText(QApplication::translate("language", "save", 0, QApplication::UnicodeUTF8)); 
  7.     } // retranslateUi</span> 
<span style="font-size:18px;"> void retranslateUi(QWidget *language)//这个也是自动生成的代码
    {
        language->setWindowTitle(QApplication::translate("language", "Form", 0, QApplication::UnicodeUTF8));
        china_rabtn->setText(QApplication::translate("language", "        \347\256\200\344\275\223\344\270\255\346\226\207", 0, QApplication::UnicodeUTF8));
        engsh_rabtn->setText(QApplication::translate("language", "         English", 0, QApplication::UnicodeUTF8));
        sav_btn->setText(QApplication::translate("language", "save", 0, QApplication::UnicodeUTF8));
    } // retranslateUi</span>

  2)不使用UI编辑器,自己通过亲自编程来设计应用程序界面的情况。

其实原理和第一种情况是一样的,只是changeEvent(QEvent *e)和retranslateUi(QWidget *language)这两个函数都要自己定义如下面所示:

</pre><p></p><p style="text-align: left;"><span style="font-family:Arial;"><span style="font-size:18px;"><span style="line-height: 25.6px;"></span></span></span></p><div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank class="ViewSource" title="view plain" href="http://blog.csdn.net/csf111/article/details/7752839#">view plain</a><a target=_blank class="CopyToClipboard" title="copy" href="http://blog.csdn.net/csf111/article/details/7752839#">copy</a><a target=_blank class="PrintSource" title="print" href="http://blog.csdn.net/csf111/article/details/7752839#">print</a><a target=_blank class="About" title="?" href="http://blog.csdn.net/csf111/article/details/7752839#">?</a></div></div><ol class="dp-cpp"><li class="alt"><span><span><span style=</span><span class="string">"font-family: Arial;"</span><span>><span style=</span><span class="string">"font-size: 18px;"</span><span>></span><span class="keyword">protected</span><span>:  </span></span></li><li><span>    <span class="keyword">void</span><span> changeEvent(QEvent *e);  </span></span></li><li class="alt"><span><span class="keyword">private</span><span>:  </span></span></li><li><span>    <span class="keyword">void</span><span> retranslate(QWidget *parent=0);</span></span>  </span></span></li></ol></div><pre style="display: none;" class="cpp" name="code"><span style="font-family:Arial;"><span style="font-size:18px;">protected:
    void changeEvent(QEvent *e);
private:
    void retranslate(QWidget *parent=0);</span></span>
函数定义如下:

  1. <span style="font-family: Arial;"><span style="font-size: 18px;">void MainWindow::changeEvent(QEvent *e) 
  2.     QWidget::changeEvent(e); 
  3.     switch (e->type())  { 
  4.     case QEvent::LanguageChange: 
  5.         retranslate(this); 
  6.         qDebug("MainWindow page"); 
  7.         break
  8.     default
  9.         break
  10.     } 
  11.  
  12. void MainWindow::retranslate(QWidget *parent) 
  13.     his_btn->setText(QApplication::translate("mainwindow", "history", 0, QApplication::UnicodeUTF8)); 
  14.     ngv_btn->setText(QApplication::translate("mainwindow", "navigation", 0, QApplication::UnicodeUTF8)); 
  15.     cur_btn->setText(QApplication::translate("mainwindow", "current", 0, QApplication::UnicodeUTF8)); 
  16.     cancel_btn->setText(QApplication::translate("mainwindow", "quit", 0, QApplication::UnicodeUTF8)); 
  17.  
  18.     fault_label->setText(QApplication::translate("mainwindow", "problem:", 0, QApplication::UnicodeUTF8)); 
  19.     fault_status->setText(QApplication::translate("mainwindow", "no problem", 0, QApplication::UnicodeUTF8)); 
  20.     comm_label->setText(QApplication::translate("mainwindow", "comstate:", 0, QApplication::UnicodeUTF8)); 
  21.     comm_status->setText(QApplication::translate("mainwindow", "normal", 0, QApplication::UnicodeUTF8)); 
  22.     time_label->setText(QApplication::translate("mainwindow", "datetime:", 0, QApplication::UnicodeUTF8)); 
  23.     //time_status->setText(QApplication::translate("parent", "no problem", 0, QApplication::UnicodeUTF8)); 
  24. }</span></span> 
<span style="font-family:Arial;"><span style="font-size:18px;">void MainWindow::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type())  {
    case QEvent::LanguageChange:
        retranslate(this);
        qDebug("MainWindow page");
        break;
    default:
        break;
    }
}

void MainWindow::retranslate(QWidget *parent)
{
    his_btn->setText(QApplication::translate("mainwindow", "history", 0, QApplication::UnicodeUTF8));
    ngv_btn->setText(QApplication::translate("mainwindow", "navigation", 0, QApplication::UnicodeUTF8));
    cur_btn->setText(QApplication::translate("mainwindow", "current", 0, QApplication::UnicodeUTF8));
    cancel_btn->setText(QApplication::translate("mainwindow", "quit", 0, QApplication::UnicodeUTF8));

    fault_label->setText(QApplication::translate("mainwindow", "problem:", 0, QApplication::UnicodeUTF8));
    fault_status->setText(QApplication::translate("mainwindow", "no problem", 0, QApplication::UnicodeUTF8));
    comm_label->setText(QApplication::translate("mainwindow", "comstate:", 0, QApplication::UnicodeUTF8));
    comm_status->setText(QApplication::translate("mainwindow", "normal", 0, QApplication::UnicodeUTF8));
    time_label->setText(QApplication::translate("mainwindow", "datetime:", 0, QApplication::UnicodeUTF8));
    //time_status->setText(QApplication::translate("parent", "no problem", 0, QApplication::UnicodeUTF8));
}</span></span>

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中实现中英文界面切换可以通过以下步骤进行: 1. 准备好中英文的翻译文件:Qt使用一种名为"Qt 语言家庭文件"(.ts)的文件来存储翻译文本。你需要准备好中文和英文的翻译文件,分别命名为`zh***然后依次打开中文和英文的翻译文件。在工具中,你可以逐个翻译每个文本字符串,并将其保存到对应的翻译文件中。 3. 在代码中加载翻译文件:在你的Qt应用程序的初始化代码中,使用`QTranslator`类来加载翻译文件。例如,你可以创建一个`QTranslator`对象,并使用`load()`方法加载对应的翻译文件。 4. 切换界面语言:在你的应用程序中提供一个切换语言的选项,例如一个菜单项或按钮。当用户选择切换语言时,你可以使用`QApplication::installTranslator()`方法来安装对应的翻译文件,并调用`QCoreApplication::translate()`方法来更新界面上的文本。 下面是一个简单的示例代码,演示了如何在Qt中实现中英文界面切换: ```cpp #include <QApplication> #include <QTranslator> #include <QMessageBox> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建翻译器对象 QTranslator translator; // 加载中文翻译文件 if (translator.load("zh_CN")) { // 安装翻译器 app.installTranslator(&translator); } else { QMessageBox::warning(nullptr, "Error", "Failed to load zh_CN translation file."); } // 创建主窗口等其他代码... return app.exec(); } ``` 当用户选择切换语言时,你可以重新加载对应的翻译文件,并更新界面上的文本。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值