Qt 国际化翻译
简介
Qt Linguist 提供了一套加速应用程序翻译和国际化的工具。Qt 使用单一的源码树和单一的应用程序二进制包就可同时支持多个语言和书写系统。
使用 QTranslator 来加载生成的 qm 文件,就可以让程序显示指定的语言。
// 国际化翻译
QString language = "CH"; // 默认为中文,后期可以使用ini方式保存语言选项
QTranslator translator;
translator.load(QString(":/Translate_") + language);
a.installTranslator(&translator);
要进行多语言的切换,需要执行以下步骤:
对用户可见的文本信息全部使用 tr() 进行封装
提供用户可以用来切换语言的一种方法。
对于每一个窗口部件或者对话框,重写 changeEvent 事件,当事件类型为
QEvent::LanguageChange时,翻译文本进行重新调用(为了简单我把它放在一个单独的函数translateUI()中)。
多语言切换实例效果

添加翻译源
为了方便,这里只介绍中、英文之间的切换。
在pro中添加:
TRANSLATIONS += Translate_EN.ts \
               Translate_CH.ts
选择:工具->外部->Qt 语言家->更新翻译,则会生成对应的 ts 文件。

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

发布翻译
选择:文件->发布,就会生成对应的 qm 文件。

源码分析
我们来看一个简单的示例:主界面可根据选择不同语言下拉选项实现语言的动态切换!
main.cpp:
#include "Translate.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    // 国际化翻译
    QString language = "CH"; // 默认为中文,后期可以使用ini方式保存语言选项
    QTranslator translator;
    translator.load(QString(":/Translate_") + language);
    a.installTranslator(&translator);
    Translate w;
    w.setTranslator(&translator);
    w.show();
    return a.exec();
}
Translate.h:
#ifndef TRANSLATE_H
#define TRANSLATE_H
#include <QWidget>
#include <QTranslator>
#include <QLabel>
#include <QComboBox>
#include <QVBoxLayout>
#include <QEvent>
#include <QApplication>
#include <QDebug>
class Translate : public QWidget
{
    Q_OBJECT
public:
    Translate(QWidget *parent = nullptr);
    void setTranslator(QTranslator* translator); // 设置翻译对象
protected:
    void changeEvent(QEvent *event); // 改变事件
private:
    void translateUI(); // 统一设置需要被翻译的文本
    QLabel *m_pLabText;
    QComboBox *m_pComboBox;
    QTranslator *m_translator; // 国际化翻译对象
};
#endif // TRANSLATE_H
Translate.cpp
#include "Translate.h"
Translate::Translate(QWidget *parent)
    : QWidget(parent)
{
    // 初始化界面
    this->setFixedSize(400, 200);
    // 初始化控件
    m_pLabText = new QLabel;
    m_pComboBox = new QComboBox;
    m_pComboBox->addItem("Chinese");
    m_pComboBox->addItem("English");
    // 主布局
    QVBoxLayout *m_pLayoutMain = new QVBoxLayout(this);
    m_pLayoutMain->addStretch();
    m_pLayoutMain->addWidget(m_pLabText, 0, Qt::AlignCenter);
    m_pLayoutMain->addSpacing(20);
    m_pLayoutMain->addWidget(m_pComboBox, 0, Qt::AlignCenter);
    m_pLayoutMain->addStretch();
    m_pLayoutMain->setMargin(0);
    // 连接信号槽
    connect(m_pComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int index) {
        QString language_qm;
        if(index == 0)
            language_qm = QString(":/Translate_CH.qm");
        else
            language_qm = QString(":/Translate_EN.qm");
        m_translator->load(language_qm);
        qApp->installTranslator(m_translator); // 安装翻译器
    });
    // 统一设置需要被翻译的文本
    translateUI();
}
// 设置翻译对象
void Translate::setTranslator(QTranslator* translator)
{
    m_translator = translator;
}
// 改变事件:调用installTranslator后,系统会给窗体发送信号触发changeEvent事件
void Translate::changeEvent(QEvent *event)
{
    switch (event->type())
    {
    case QEvent::LanguageChange:
        translateUI();
        break;
    default:
        QWidget::changeEvent(event);
    }
}
// 统一设置需要被翻译的文本
void Translate::translateUI()
{
    m_pLabText->setText(tr("这是需要测试的文本"));
}
FloatWidget.cpp
#include "HelperWidget.h"
HelperWidget::HelperWidget(QWidget *parent) : QWidget(parent)
{
    /* 界面初始化 */
    this->setFixedSize(500, 200);
    this->setWindowFlags(Qt::FramelessWindowHint);
    this->setObjectName("FloatWidget");
    setAttribute(Qt::WA_StyledBackground); // 不继承父窗口样式
    m_pLabName = new QLabel;
    m_pLabIp = new QLabel;
    m_pBtnGet = new QPushButton;
    m_pBtnPush = new QPushButton;
    m_pBtnVideo = new QPushButton;
    m_pLabSet = new QLabel;
    m_pLabName->setText(tr("运维平台主屏"));
    m_pLabIp->setText("192.168.1.71");
    m_pBtnGet->setText("接管");
    m_pBtnPush->setText("推送");
    m_pBtnVideo->setText("视频");
    m_pLabSet->setText("设置");
    m_pLabSet->installEventFilter(this);
    // 悬浮小窗口-窗口部件初始化
    m_pWidgetFloatSet = new QWidget;
    m_pBtnUser = new QPushButton;
    m_pBtnMatrix = new QPushButton;
    m_pBtnShortCut = new QPushButton;
    m_pWidgetFloatSet->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
    m_pWidgetFloatSet->installEventFilter(this);
    m_pBtnUser->setText("用户权限");
    m_pBtnMatrix->setText("矩阵");
    m_pBtnShortCut->setText("快捷键");
    QVBoxLayout *pVLayoutSet = new QVBoxLayout(m_pWidgetFloatSet);
    pVLayoutSet->addWidget(m_pBtnUser);
    pVLayoutSet->addWidget(m_pBtnMatrix);
    pVLayoutSet->addWidget(m_pBtnShortCut);
    QHBoxLayout *pHLayoutBtn = new QHBoxLayout;
    pHLayoutBtn->addWidget(m_pBtnGet);
    pHLayoutBtn->addWidget(m_pBtnPush);
    pHLayoutBtn->addWidget(m_pBtnVideo);
    pHLayoutBtn->addWidget(m_pLabSet);
    QVBoxLayout *pVLayoutMain = new QVBoxLayout(this);
    pVLayoutMain->addWidget(m_pLabName);
    pVLayoutMain->addWidget(m_pLabIp);
    pVLayoutMain->addLayout(pHLayoutBtn);
    pVLayoutMain->addSpacing(60);
    // 信号槽链接
    connect(m_pBtnGet, &QPushButton::clicked, [=]() {
        emit sigBtnClickedGet();
    });
    connect(m_pBtnPush, &QPushButton::clicked, [=]() {
        emit sigBtnClickedPush();
    });
    connect(m_pBtnVideo, &QPushButton::clicked, [=]() {
        emit sigBtnClickedVideo();
    });
    // 在eventFilter中处理显隐则导致鼠标进入不了悬浮窗就会隐藏,所以用定时器去做
    m_pTimerFloat = new QTimer;
    m_pTimerFloat->setInterval(100);
    connect(m_pTimerFloat, &QTimer::timeout, [=]() {
        if ((m_pWidgetFloatSet != nullptr) && (m_pWidgetFloatSet->isVisible()))
        {
            // 判断鼠标是否游离到了悬浮窗之外,如果游离出去了,那么隐藏窗口
            QPoint currentPos = QCursor::pos();
            QRect floatWidgetRect = m_pWidgetFloatSet->rect();
            QRect rect(m_pWidgetFloatSet->pos().x(), m_pWidgetFloatSet->pos().y(), floatWidgetRect.width(), floatWidgetRect.height());
            if (!rect.contains(currentPos)){
               m_pWidgetFloatSet->hide();
               m_pTimerFloat->stop();
            }
        }
    });
}
// 事件过滤器(实现悬浮小窗口)
bool HelperWidget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == m_pLabSet)
    {
        if (event->type() == QEvent::Enter)
        {
            QPoint oWidgetPoint = this->mapToGlobal(m_pLabSet->pos());
            m_pWidgetFloatSet->setGeometry(oWidgetPoint.x(), oWidgetPoint.y() + m_pLabSet->height(), 80, 80);
            m_pWidgetFloatSet->show();
            m_pTimerFloat->stop();
            return true;
        }
        else if (event->type() == QEvent::Leave) //如果是其他事件,可以进行进一步的处理
        {
            m_pTimerFloat->start();
            return false;
        }
        else
            return false;
    }
    else if (obj == m_pWidgetFloatSet)
    {
        if (event->type() == QEvent::Leave)
        {
            m_pWidgetFloatSet->hide();
            return false;
        }
        else
            return false;
    }
    else
        return QWidget::eventFilter(obj, event);
}
												
											Qt 国际化翻译的更多相关文章
- QT国际化 一 (lupdate/linguits/lrelease)
		
QT国际化(lupdate/linguits/lrelease) 本文由乌合之众瞎写http://www.cnblogs.com/oloroso/ qt国际化其实就是qt中字符串的字符集编码的设置.当 ...
 - 【Qt】Qt国际化【转】
		
简介 Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下. 对于绝大多数的应用程序,在刚启动时,需要加载默认的语言(或最后一次设置的语言) ...
 - Qt国际化详细介绍,中文乱码以及解决方案
		
Qt国际化的一般步骤 运行 lupdate,从应用程序的代码中提取所有界面上的可见字符. 这些可见字符必须被 tr() .QCoreApplication::translate().Qt ...
 - QT国际化(中英转换)
		
转载:https://blog.csdn.net/u012528526/article/details/54707233 QT国际化(中英转换) 我们都知道在安卓中,想做国际化很简单,只需要建立对应的 ...
 - Ios国际化翻译工具
		
IOS Translation Tool(IOS国际化翻译工具) 介绍 当IOS项目国际化的时候,手工去翻译每一个字符串是一件非常痛苦的事情.尤其是当项目中存在N多种语言.而且又很难保证,手工翻译的准 ...
 - 给iview项目加一个i18n国际化翻译
		
看了上一篇博客吗?我们就根据那一篇博客来,用里面的项目,进行我们接下来国际化翻译项目. 我们安装vue-i18n和js-cookie npm install vue-i18n npm install ...
 - Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)
		
Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...
 - qt 国际化(翻译时会触发changeEvent)
		
1. 修改工程文件 .pro ,加入翻译源文件 hello_world.ts: TRANSLATIONS += \ Resource/translations/hello_world.t ...
 - 6. QT国际化 translate QT语言家  翻译
		
main. QTranslator *qtTranslator = new QTranslator(); if (IsChinese()) { qtTranslator->load(" ...
 
随机推荐
- linux篇-Centos7构建NFS服务器和连接
			
准备两台centos7虚拟机 192.168.30.133 192.168.30.129 2.192.168.30.1(服务端), 3查看rpc服务是否启动 4测试安装是否成功 5修改配置文件vi/e ...
 - 在 GitHub 上玩转开源项目的 Code Review
			
一.幕后故事 时光荏苒,岁月如梭-- (太文绉绉了,这不是我的风格) 今天我准备聊聊在 GitHub 上如何玩 Code Review. 突发奇想?心血来潮?不是. 咋回事呢?(对八卦不感兴趣的可以直 ...
 - 树莓派开发笔记(十五):树莓派4B+从源码编译安装mysql数据库
			
前言 树莓派使用数据库时,优先选择sqlite数据库,但是sqlite是文件数据库同时仅针对于单用户的情况,考虑到多用户的情况,在树莓派上部署安装mysql服务,通过读写锁事务等使用,可以实现多进 ...
 - 数据分析工具Metabase--Metabase安装(最详细的安装教程)
			
Meatabase介绍 Metabase 是一款开源的BI工具.主要可以实现在线的可视化分析,单独生成分析图标,定时刷新数据集,权限管理,报告分享等一系列功能. Metabase支持多种市面上主流的数 ...
 - markdowm使用学习
			
markdowm学习 标题(#/##/###/####) 三级标题 四级标题 字体(*/) hello world! hello world! hello world! hello world! he ...
 - DevOps落地实践点滴和踩坑记录-(1)
			
记录初衷 本人一直在从事企业内DevOps落地实践的工作,走了不少弯路,也努力在想办法解决面临的问题,期间也经历过不少人和事情,最近突然有想法把经历过的,不管好的不好的都记录下来,分享给和我一样的一线 ...
 - 在公网服务器搭建CobaltStrike4.0
			
因为工作需要使用cs,正好之前腾讯云薅了一把羊毛,就把VPS装起来cs. 选的环境是centos7.6 cs运行需要java环境 先使用yum -y list java* 查看yum存在的java库 ...
 - CVE-2021-3156漏洞复现
			
CVE-2021-3156linux sudo 权限提升 版本ubantu18.04 使用这个命令可以是普通用户直接提升至管理员权限. 手动测试终端输入 sudoedit -s / 不知道什么原因ub ...
 - ant design pro生产和开发环境的坑
			
1.axios的get请求开发环境会自动带上cookie,但是生产环境则不会,需要手动设置以下代码: axios.defaults.withCredentials=true; 2.models全局和局 ...
 - Web思维导图实现的技术点分析(附完整源码)
			
简介 思维导图是一种常见的表达发散性思维的有效工具,市面上有非常多的工具可以用来画思维导图,有免费的也有收费的,此外也有一些可以用来帮助快速实现的JavaScript类库,如:jsMind.KityM ...