Qt动态语言的切换,最关键一步,先删除qApp->removeTranslator(currentTranslator);

原理:

最简单的方式是用 QTranslator, 然后用 QApplication::installTranslator 来设置。后续想改,移除旧的 translator 然后再挂接新的 translator 。通过查找资料及查看 Qt 文档,发现动态切换语言的方式是 Override QWidget 的QEvent::LanguageChange

* 整个过程是这样的,在QApplication::installTranslator之后,其会发送QEvent::ChangeLanguage这个事件,通过在主窗口中捕捉这个事件,然后在其中决定install哪个Translator,注意,在做完此步之后,需要对所有与语言相关的控件再重新设置一遍即可。

 

实作:

在写完代码后,需要再写一个特定的 .pro 文件,如果你之前用的就是 qmake 来管理 project, 则不需要做这一步,如果你像我一样用 cmake 来管理 Qt 工程,则需要写一个 .pro 文件,只需要包含需要翻译的文件即可,不需要像使用 qmake 一样写全。用 lupdate 更新源代码,得到 .ts 文件,然后用 qlinguist 加载此 .ts 文件,翻译完后,用lrelease 更新 project 文件,自动生成 .qm 文件。

 

动态翻译实作

main_widget代码

[cpp]  view plain copy
  1. #ifndef _MAINWIDGET_H_  
  2. #define _MAINWIDGET_H_  
  3. #include <QWidget>  
  4. #include <QMenuBar>  
  5. #include <QVBoxLayout>  
  6. #include <QAction>  
  7. #include <QLabel>  
  8. #include "TestDialog.h"  
  9. #include <QTranslator>  
  10. class MainWidget : public QWidget  
  11. {  
  12.   Q_OBJECT  
  13.  public:  
  14.   MainWidget(QWidget* parent = 0) : QWidget( parent ) {  
  15.     menu_bar_ = new QMenuBar( this );  
  16.     file_menu_ = new QMenu( QString( tr( "File" ) ),menu_bar_ );  
  17.     change_language_action_ = new QAction( QString( tr( "Change Language" ) ),file_menu_ );  
  18.     change_language_action_->setCheckable(true);  
  19.     change_language_action_->setChecked(false);  
  20.     connect( change_language_action_,SIGNAL( triggered( ) ) ,this,SLOT( slot_change_language(  ) ) );  
  21.   file_menu_->addAction( change_language_action_ );  
  22.   toggle_test_dialog_action_ = new QAction( QString( tr( "Show Test Dialog" ) ),file_menu_ );  
  23.   file_menu_->addAction( toggle_test_dialog_action_ );  
  24.   connect( toggle_test_dialog_action_,SIGNAL( triggered(  ) ),this,SLOT( slot_show_test_dialog(  ) ) );  
  25.   menu_bar_->addMenu( file_menu_ );  
  26.     layout_ = new QVBoxLayout( this );  
  27.     layout_->setMenuBar( menu_bar_ );  
  28.     label_ = new QLabel( QString( tr( "This is a test label" ) ),this );  
  29.     layout_->addWidget( label_ );  
  30.     setLayout( layout_ );  
  31.     test_dialog_ = new TestDialog(this);  
  32.   }  
  33.   virtual ~MainWidget() {  
  34.     delete layout_;  
  35.     delete label_;  
  36.     delete menu_bar_;  
  37.     delete test_dialog_;  
  38.   }  
  39. protected:  
  40.     void changeEvent(QEvent* event) {  
  41.         if(event->type() == QEvent::LanguageChange) {  
  42.             retranslate();  
  43.             test_dialog_->retranslateUi(test_dialog_);  
  44.         } else   
  45.             QWidget::changeEvent(event);  
  46.     }  
  47. public slots:  
  48. void slot_change_language(  ){  
  49.     if(change_language_action_->isChecked()) { //en  
  50.         qApp->removeTranslator(currentTranslator);  
  51.         currentTranslator = new QTranslator();  
  52.         currentTranslator->load("en.qm");  
  53.         qApp->installTranslator(currentTranslator);  
  54.     } else {        //cn  
  55.         currentTranslator = new QTranslator();  
  56.         currentTranslator->load("cn.qm");  
  57.         qApp->installTranslator(currentTranslator);  
  58.     }  
  59. }  
  60. void slot_show_test_dialog(  ) {  
  61.   test_dialog_->exec();  
  62. }  
  63. private:  
  64.     void installTranslator() {  
  65.         currentTranslator  = new QTranslator();  
  66.         currentTranslator->load("en.qm");  
  67.         qApp->installTranslator(currentTranslator);  
  68.     }  
  69.     void retranslate() {  
  70.         file_menu_->setTitle(QString(tr("File")));  
  71.         change_language_action_->setText(QString(tr("Change Language")));  
  72.         toggle_test_dialog_action_->setText(QString(tr("Show Test Dialog")));  
  73.         label_->setText(QString(tr("This is a test label")));  
  74.     }  
  75.  private:  
  76.   QMenuBar* menu_bar_;  
  77.   QMenu* file_menu_;  
  78.   QAction* change_language_action_;  
  79. QAction* toggle_test_dialog_action_;  
  80.   QVBoxLayout* layout_;  
  81.   QLabel* label_;  
  82.   TestDialog* test_dialog_;  
  83.   QTranslator* currentTranslator;  
  84. };  
  85. #endif /* _MAINWIDGET_H_ */  
  86. /* MainWidget.h ends here */  

主函数

[cpp]  view plain copy
  1. #include "MainWidget.h"  
  2. #include <QApplication>  
  3. int main(int argc, char *argv[])  
  4. {  
  5.   QApplication app( argc,argv )  ;  
  6.   MainWidget main_widget;  
  7.   main_widget.resize( 640,480 );  
  8.   main_widget.show(  );  
  9.   return app.exec(  );  
  10. }  
  11. //   
  12. // main.cpp ends here  

cmake工程文件CMakeLists.txt

[cpp]  view plain copy
  1. set(target_name QtDynamicTranslationTest)  
  2. cmake_minimum_required(VERSION 2.6)  
  3. find_package(Qt4 REQUIRED)  
  4. include(${QT_USE_FILE})  
  5. qt4_wrap_cpp(MainWidget_MOC MainWidget.h)  
  6. add_executable(${target_name} main.cpp TestDialog.h MainWidget.h ${MainWidget_MOC})  
  7. target_link_libraries(${target_name} ${QT_LIBRARIES})  

另外,还对QDesigner设计的窗口也进行了测试,亦即测试了手写的代码的语言切换与QDesigner创建的控件的语言切换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
http://blog.csdn.net/yulinxx/article/details/43260203 ------------------------------------------ C++ 国际化!!!!! 创建一个空白的Qt工程 添加一个main.cpp #include #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv) QWidget* pWnd = new QWidget(); QPushButton* pBtn = new QPushButton(QPushButton::tr("Test Translate")) QVBoxLayout* pVlayout = new QVBoxLayout(); pVlayout->addWidget(pBtn) pWnd->setLayout(pVlayout); pWnd->show(); return a.exec(); } 即可运行起来。。。。 此工程中,只有按钮上有文字。。。运行如下图示: 在工程中加入: TRANSLATIONS += testTrans_en.ts (ts文字名可随意取) 然后执行: Tools -> External -> Linguist -> Update Translations(lupdate) 提示完成: /usr/local/Qt5.4.0/5.4/gcc_64/bin/lupdate" finished 在工程中,可以发现多了一个 testTrans_en.ts 文件,此文件可用文本编辑器打开进行查看,如: QPushButton Test Translate 此步骤是将工程中的文字(加tr等包含的文字)进行提取到ts文件中 接下来,在终端运行 x@x:~$ linguist 打开 Qt Linguist 翻译工具,对文字进行逐个翻译并保存 在工程中再执行: Tools -> External -> Linguist -> Release Translations(lrelease) 结果提示:/usr/local/Qt5.4.0/5.4/gcc_64/bin/lrelease" finished 在工程中,可以发现多了一个 testTrans_en.qm文件,此文件为二进制格式文件,即我们最终使用的翻译文件 然后添加Qt资源,将testTrans_en.qm添加进来 修改main.cpp文件,将翻译文件添加进来,最终执行 #include #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); QTranslator qtTranslator; qtTranslator.load(":/translate/testTrans_en.qm") a.installTranslator(&qtTranslator); QWidget* pWnd = new QWidget(); QPushButton* pBtn = new QPushButton(QPushButton::tr("Test Translate")) QVBoxLayout* pVlayout = new QVBoxLayout(); pVlayout->addWidget(pBtn) pWnd->setLayout(pVlayout); pWnd->show() return a.exec() } 最终执行结果:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值