QT 国际化 动态切换中英文

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33559992/article/details/79802950

Qt 国际化 动态切换中英文

由于项目需要,需要在界面中实现动态切换中英文。由此记录下实现方法。

首先

如图所示:在右上角中有一个按钮切换选择中英文。
这里写图片描述
实现效果:

  • 点击菜单按钮后弹出两个子菜单列表。选择中英文。

实现方法:

  • 将PushButton按钮转换为菜单按钮,在某些样式中,按钮的文本右侧会生成一个小三角形。
m_menu  =  new  QMenu;
m_English  =  new  QAction(tr("English"),this);
m_China  =  new  QAction(tr("中文"),this);
m_menu->addAction(m_China);
m_menu->addAction(m_English);
m_pTitleBar->m_pBtnMenu->setMenu(m_menu);

设置菜单按钮的样式:

m_menu->setStyleSheet("QMenu{\

  background-color:rgb(89,87,87);\

  }\

  QMenu::item{\

  color:  rgb(225,225,225);\

  border:  1px  solid  rgb(60,60,60);\

  background-color:rgb(89,87,87);\

  padding:5px  30px  5px  5px;\

  }\

  QMenu::item:selected{  \

  background-color:rgb(235,110,36);\

  }\

  QMenu::item:pressed{\

  border:  1px  solid  rgb(60,60,61);  \

  background-color:  rgb(220,80,6);  \

  }");
//三角形按钮不显示
m_pTitleBar->m_pBtnMenu->setStyleSheet("QPushButton::menu-indicator{image:none};");

以上就可以实现将按钮装换为菜单按钮。

其次,需要将所有转换的字体前面添加上QObject::tr();表示可翻译。

具体操作如下:

  • 对用户可见的文本信息全部使用tr()进行封装。

  • 在pro中添加:

TRANSLATIONS  +=  resources/tr_zh.ts  \
        resources/tr_en.ts

选择:工具->外部->Qt语言家->更新翻译,则会生成对应的ts文件。

这里写图片描述

  • 翻译:

使用Qt Linguist打开要翻译的ts文件,对翻译源进行相应语言的翻译。

这里写图片描述

这里写图片描述

具体可参考:Qt Linguist介绍

  • ### 发布翻译,生成对应的xxx.qm文件
    使用Qt Liguust翻译完成以后,在Qt工具 –> 外部 –> Qt语言家 –> 发布翻译
    (中文,英文都要翻译。tr(” “)中的文本只是一个源 Sources ,程序加载翻译文件后,就是将源替换为翻译后的文本,因此中英文都需要翻译。)

这里写图片描述

  • 添加xxx.qm文件进资源文件。

    这里写图片描述

  • 加载翻译文件:

    使用QTranslator来加载生成的qm文件,就可以让程序显示指定的语言。

    QTranslator translator;
    translator.load(":/qm/main_widget_zh"); 
    app.installTranslator(&translator);

    通过以上方法就可以实现静态的加载。也就是程序一开始运行的时候,加载相应的翻译文件。

动态加载的话,就需要用到上述的菜单按钮,点击后添加槽函数:

//连接槽函数
connect(m_menu,  SIGNAL(triggered(QAction*)),  this, SLOT(slot_MenuTriggered(QAction*)));
//槽函数实现动态切换语言,加载翻译文件
void  MyMainWindow::slot_MenuTriggered(QAction  *m_TriggeredAction)
{
    static  QTranslator*  translator;
        if  (translator  !=  NULL){
            qApp->removeTranslator(translator);//如果之前加载过翻译文件,则移除之前的翻译文件。
        delete  translator;
            translator  =  NULL;
    }
    translator  =  new  QTranslator;
    if(m_TriggeredAction->text()  ==QObject::tr("中文")){
        if(translator->load(":/qm/resources/tr_zh.qm")){
            qApp->installTranslator(translator);
        }
    }else  if(m_TriggeredAction->text() ==QObject::tr("English")){
        if(translator->load(":/qm/resources/tr_en.qm")){
            qApp->installTranslator(translator);
        }
    }
    ReTrenslate_Ui();//再次调用,重新加载可见文本。实现翻译
}
//重新加载可见文本
void  MyMainWindow::ReTrenslate_Ui()
{
    m_pConnectWidget->m_pBtnConnect->setText(tr("连接串口"));
    ...
    ...
}

该ReTrenslate_Ui()函数在MyMainWindow构造函数中的时候需要第一次调用。然后在动态切换语言以后需要再一次调用。

注意:如果语言库qm文件里面的字段一个都没有翻译的话,调用QTranslator::load()加载的话会一直返回false,我项目中是中英文切换,所以一开始我是生成了两个qm文件,一个中文,一个英文的,中文语言库是直接更新然后发布,没有做任何翻译操作,所以导致加载中文语言库一直失败,至于原因查了半天也没有个所以然来,如果有了解的忘告知,如果需要恢复默认的直接load(“”)就可以了。

猜你喜欢

转载自blog.csdn.net/qq_33559992/article/details/79802950