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(" ...
随机推荐
- BUUCTF刷题记录(更新中...)
极客大挑战 2019]EasySQL-1 直接通过输入万能密码:' or 1=1#实现注入: 思考:服务端sql语句应该为:select * from users where username='xx ...
- Redis快速度特性及为什么支持多线程及应用场景
转载请注明出处: 目录 1.Redis 访问速度快特性 2.Redis 6.0 为什么支持多线程? 3.Redis可以做什么 3.1.缓存 3.2.排行榜系统 3.3.计数器应用 3.4.社交网络 3 ...
- 在linux上开启酸酸乳,未完待续
在服务器调试深度学习环境的时候总需要下载conda的包,一直以来都觉得是因为国内访问慢,于是想在服务器上开 ,或者ssr.由于过去用ssr多一些,于是想了解ssr on linux. 1.首先win1 ...
- 遍历list集合泛型为map
public class ListAddMap { public static void main( String args[] ) { List<Map<String, Object&g ...
- python基础学习7
python基础学习7 内容概要 字符串的内置方法 字符串的内置方法(补充) 列表的内置方法 可变类型与不可变类型 队列与堆栈 内容详情 字符串的内置方法 # 1.strip 移除字符串首尾的指定字符 ...
- Google搜索为什么不能无限分页?
这是一个很有意思却很少有人注意的问题. 当我用Google搜索MySQL这个关键词的时候,Google只提供了13页的搜索结果,我通过修改url的分页参数试图搜索第14页数据,结果出现了以下的错误提示 ...
- Centos 创建新的虚拟环境
1. conda env list 查看目前已经存在的虚拟环境,注意新取的虚拟环境的名字不能和目前已存在的虚拟环境的名字相同! 2. conda create -n [环境名] [指定python版本 ...
- SAP Web Dynpro-协助类
在Web Dynpro组件中,您可以创建从抽象类继承的唯一分配的类. 协助类可以存储组件中必需的但未与布局链接的编码. 您可以将动态文本存储在协助类中,也可以在运行时合并文本,也可以将变量存储在文本池 ...
- linux web漏洞扫描arachni
1. 下载arachni https://www.arachni-scanner.com/download/下载Linux x86 64bit 2. 上次解压直接使用 tar xzf arachni- ...
- rhel修改系统语言
修改系统语言的三种方式 1.yum install system-config-language //挂载本地源,然后安装 system-config-language 2. ...