QT in VS 多语言实现(中英文切换,每个步骤都有截图,只有UTF8才能让Qt语言家正确读取。先qApp->removeTranslator,然后installTranslator,每个类都要写上槽函数RetranslateUI)
最近项目需要软件具有中英文双语切换功能,而QT又自带此功能,现将实现方式记录下来。
说到中英文切换,少不了要了解QT的内部编码方式。在此就不详述QT编码方式了,具体可参考 彻底弄懂Qt的编码。只需要记住QT采用utf-8编码!window操作系统采用ansi编码,简体中文操作系统的ansi代表gbk。
1. 生成.ts文件
前置步骤:所有需要翻译的内容用QObject::tr()包起来。具体自行了解一下QObject::tr()的功能。
先创建一个factory类:
// factory.cpp
factory::factory()
{
QString str = QObject::tr("我是中国人");
}
1
2
3
4
5
打开项目 =>【QT VS TOOLS】=> 【Create New Translation File】=> 【选择语言】=> 【ok】创建ts文件,默认在项目根目录。
2. 打开linguis,打开ts文件,翻译,生成qm文件
【QT VS TOOLS】=> 【Launch Qt Linguist】=> 等待打开linguist工具 =>【linguist打开ts文件】
打开ts文件后看到乱码:
导致的原因是源码文件采用的非utf-8编码格式,要将源码文件改为utf-8格式。
解决方式:【在vs中打开源码文件】=> 【文件】=> 【高级保存选项】=> 【编码:Unicode(utf-8 带签名)】=> 像上述一样再次创建ts文件
再打开linguist看一下:
翻译,然后生成qm文件 【文件】 => 【发布】即可在项目根目录下生成一个与ts同名的qm文件。
3. 中英文切换
这里是重点了,就不使用之前的代码了。实现一个登陆页面语言切换功能。
新建一个CLinguist类,用于语言管理:
// Linguist.h
#pragma once
/*
语言家,配置当前系统的语言
*/
#include <QObject>
#include <qtranslator.h>
enum Language
{
zh_cn,
en_us,
undefined
};
class CLinguist :public QObject
{
Q_OBJECT
private:
CLinguist();
public:
// 当前语言 简体中文、英文、未定义
Language m_CurrentLanguage = Language::undefined;
// 切换语言
void ChangeLanguage(Language lan);
static CLinguist * GetLinguistInstance();
private:
static CLinguist * linguist;
QTranslator * m_trans;
signals:
// 语言切换信号,通知当前系统语言已经被切换
void LanguageChaned();
};
//Linguist.cpp
#include "Linguist.h"
#include <qcoreapplication.h>
CLinguist * CLinguist::linguist = nullptr;
CLinguist::CLinguist()
{
m_trans = new QTranslator;
}
CLinguist * CLinguist::GetLinguistInstance()
{
if (nullptr == linguist)
{
linguist = new CLinguist;
}
return linguist;
}
void CLinguist::ChangeLanguage(Language lan)
{
if (lan == this->m_CurrentLanguage || lan == Language::undefined) return;
bool ret;
switch (lan)
{
case zh_cn:
if (nullptr != m_trans)
{
qApp->removeTranslator(m_trans);
}
ret = m_trans->load("snirisaccesssys_zh.qm");
if (ret)
{
qApp->installTranslator(m_trans);
}
break;
case en_us:
if (nullptr != m_trans)
{
qApp->removeTranslator(m_trans);
}
ret = m_trans->load("snirisaccesssys_en.qm");
if (ret)
{
qApp->installTranslator(m_trans);
}
break;
default:
break;
}
if(ret)
{
this->m_CurrentLanguage = lan;
// 发出语言被切换的信号
emit LanguageChaned();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
在main函数中设置默认的语言:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
/**
......
*/
CLinguist* lin = CLinguist::GetLinguistInstance();
lin->ChangeLanguage(Language::zh_cn);
/**
......
*/
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
登陆类CLogin:
// Login.h
#pragma once
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif
#include <QObject>
#include <qwidget.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qgridlayout.h>
#include <qlabel.h>
#include <qboxlayout.h>
#include <qmessagebox.h>
#include <qcombobox.h>
#include <qtranslator.h>
class CLogin : public QDialog
{
Q_OBJECT
public:
CLogin(QWidget *parent = 0);
~CLogin();
/**
... 省略了部分内容,包括布局控件和登陆取消按钮...
*/
QPushButton * m_btnChangeLanguage;
QLineEdit * m_leUserName;
QLineEdit * m_lePwd;
QTranslator* m_translator;
QLabel * m_lblUserName;
QLabel * m_lblPwd;
void on_btnChangeLanguage_clicked();
// 刷新ui界面的文字
void RetranslateUI();
// 这句比较重要,连接信号槽,因为是单例,所以想买中所有需要切换语言的地方都需要连接CLinguist::LanguageChaned信号
CLinguist* lin = CLinguist::GetLinguistInstance();
connect(lin, &CLinguist::LanguageChaned, this, &CBaseForm::RetranslateUI);
};
// Login.cpp
#include "Login.h"
#include "Linguist.h"
CLogin::CLogin(QWidget *parent, int id)
: CBaseForm(id, parent)
{
/**
...省略各种控件初始化及布局操作
*/
m_btnChangeLanguage = new QPushButton;
connect(m_btnChangeLanguage, &QPushButton::clicked, this, &CLogin::on_btnChangeLanguage_clicked);
RetranslateUI();
}
CLogin::~CLogin()
{
}
void CLogin::RetranslateUI()
{
m_lblUserName->setText(tr("用户名:"));
m_lblPwd->setText(tr("密 码:"));
m_btnChangeLanguage->setText(tr("中文"));
}
void CLogin::on_btnChangeLanguage_clicked()
{
CLinguist* lin = CLinguist::GetLinguistInstance();
if (lin->m_CurrentLanguage == Language::en_us)
{
lin->ChangeLanguage(Language::zh_cn);
}
else
{
lin->ChangeLanguage(Language::en_us);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
还有一点想说一下,如何实现中英文切换按钮在设置为中文的时候显示【English】,设置为英文的时候显示【中文】,看下面的图你就懂了:
就是翻译的时候English译文为【中文】,汉语译文为【English】即可!
---------------------
作者:david大伟哥
来源:CSDN
原文:https://blog.csdn.net/lwwl12/article/details/80485123
版权声明:本文为博主原创文章,转载请附上博文链接!
QT in VS 多语言实现(中英文切换,每个步骤都有截图,只有UTF8才能让Qt语言家正确读取。先qApp->removeTranslator,然后installTranslator,每个类都要写上槽函数RetranslateUI)的更多相关文章
- WPF 界面实现多语言支持 中英文切换 动态加载资源字典
1.使用资源字典,首先新建两个字典文件en-us.xaml.zh-cn.xaml.定义中英文的字符串在这里面[注意:添加xmlns:s="clr-namespace:System;assem ...
- 如何在CentOS里切换操作系统所用的语言,中英文切换
操作系统CentOS 7.5,安装的时候选择的事中文,后来想改成英文 1.点左上角的“应用程序”---->再点“系统工具”----->“设置” 2.点“区域语言”,再点右侧的“汉语(中国) ...
- React为啥很多类里的标签上事件处理函数要用bind(this)
render() { return ( <div> <p onClick={this.clickHandler.bind(this)}>vz</p> </di ...
- 【Qt编程】Qt学习之窗口间的相互切换
在用Qt设计GUI时,经常要设计两个窗口之间的相互切换,即可以从一个窗口跳转到另一个窗口,然后又从另一个窗口跳转回原窗口.下面我们来介绍具体的实现方法: 工程建立及功能描述: 首先,我们建立Qt G ...
- JS国际化网站中英文切换(理论支持所有语言)应用于h5版APP
网页框架类APP实现国际化参考文案一 参考:https://blog.csdn.net/CSDN_LQR/article/details/78026254 另外付有自己实现的方法 本人用于H5版的AP ...
- 无法启动 Maya 集成的 qt designer 的解决方法和原因 以及 中英文切换
无法启动 Maya 集成的 qt designer 的解决方法和原因 以及 中英文切换 前言: Maya 集成了 PySide,同时集成了qt designer,在 Maya 的安装目录下的 bin ...
- 利用Qt中的ui文件生成PyQt5程序,自定义槽函数
1.在Qt Creator4.8.0上面设计如上.ui文件 2.点击上方图标,可以建立信号-槽连接,button_click()为自定义槽函数 3.设计目的:点击clear按钮,可消除上方文本框中的内 ...
- Qt 信号和槽函数
信号和槽是一种高级接口,应用于对象之间的通信,它是 QT 的核心特性.当某个信号被发射,就需要调用与之相绑定的槽函数.这与Windows下的消息机制类似,消息机制是基于回调函数.一个回调即是一个函数的 ...
- Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)
周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博 ...
随机推荐
- python 加密方法总结
MD5 def md5(str): import hashlib m = hashlib.md5() m.update(str) return m.hexdigest() base64 import ...
- array2json
原文:jQuery方法扩展:type, toJSON, evalJSON. http://zhkac.iteye.com/blog/499330 .2013-05-19 (function($) { ...
- HTML5中的拖放
关于HTML5中的拖放 拖放(Drag 和 Drop)是一种常见的特性,即抓取对象以后拖到另一个位置,在 HTML5 中,拖放是标准的组成部分.在HTML5中用户可以使用鼠标选择一个可拖动元素,将元素 ...
- debug宏起作用应用
在linux内核中重新定义了printk,如pr_debug,dev_dbg等.要使用这些宏函数就需要定义DEBUG. 详见:kernel printk信息显示级别 那么DEBUG该定义在什么地方呢? ...
- java定时调度器解决方案分类及特性介绍
什么是定时调度器? 我们知道程序的运行要么是由事件触发的,而这种事件的触发源头往往是用户通过ui交互操作层层传递过来的:但是我们知道还有另外一种由机器系统时间触发的程序运行场景.大家想想是否遇到或者听 ...
- CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占
CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占
- js 去掉数组中重复的对象
function deteleObject(obj) { // console.log(obj) var uniques = []; var stringify = {}; ; i < obj. ...
- 我为什么喜欢Go语言123123
从2000年至今,也写了11年代码了,期间用过VB.Delphi.C#.C++.Ruby.Python,一直在寻找一门符合自己心意和理念的语言.我很在意写代码时的手感和执行的效率,所以在Go出现之前一 ...
- 我们把Mybatis的功能架构分为三层:
我们把Mybatis的功能架构分为三层: (1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理. (2) ...
- Java8:使用 Optional 处理 null
写过 Java 程序的同学,一般都遇到过 NullPointerException :) —— 为了不抛出这个异常,我们便会写如下的代码: User user = getUserById(id); i ...