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   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include "TestDialog.h"  
  9. #include   
  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   
  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创建的控件的语言切换。

你可能感兴趣的:(qt)