【QT】QT多语言切换

QT多语言切换

  • 1.创建任意一个项目
  • 2. 利用lupdate(language update)工具生成.ts文件
    • 2.1 在工程中的.pro文件中指定.ts文件要存放的位置
    • 2.2 选择工具--》外部--》Qt语言家--》更新翻译
  • 3. 利用 lrelease(Language Release)将 .ts 文件翻译成指定语言的 .qm 文件
    • 3.1 启动对应版本的 linguist.exe(语言处理专家) 程序(在开始菜单与Qt-creator同级的应用)
    • 3.2 点击工具栏的“打开”按钮(或者点击菜单“文件 --》打开”),选择打开
    • 3.3 根据上一步选择的目标语言是zn_CN.ts ,所以目标语言是中文即可(选择.ts文件是什么语言目标语言就是对应的该语言)
    • 3.4 按如下步骤将所有文本翻译成对应语言(我这里是中文)
    • 3.5 所有翻译完成后点击保存再发布
    • 3.6 点击菜单栏的 文件 --》发布
    • 3.7 在.ts文件夹下生成的.qm文件
    • 3.8 该翻译文件完成,点击菜单栏的文件--》关闭 关闭该文件,再打开其它要翻译的文件
    • 3.9 按上述步骤即可完成其它需要翻译的语言
  • 4. 在项目中添加 加载 qm 文件、安装翻译器 qTranslator、翻译后刷新界面的代码
      • 示例代码:可直接放入工程测试
      • 现象:

该例程使用的是Qt内置提供的多语言切换方法,优点是无需重启便能动态切换界面语言

1.创建任意一个项目

2. 利用lupdate(language update)工具生成.ts文件

ts(Translation Sourcefile)是XML格式的翻译源文件

2.1 在工程中的.pro文件中指定.ts文件要存放的位置

TRANSLATIONS += res/language/zh_CN.ts \res/language/en_US.ts

如下图:
在这里插入图片描述
注意:该路径需要自己在工程文件夹中新建(可自定义)
在这里插入图片描述

2.2 选择工具–》外部–》Qt语言家–》更新翻译

在这里插入图片描述
有如下信息输出说明生成成功:

在这里插入图片描述

若不添加会报如下警告:

在这里插入图片描述

3. 利用 lrelease(Language Release)将 .ts 文件翻译成指定语言的 .qm 文件

.qm 文件是 Qt message Qt 信息文件

3.1 启动对应版本的 linguist.exe(语言处理专家) 程序(在开始菜单与Qt-creator同级的应用)

在这里插入图片描述

3.2 点击工具栏的“打开”按钮(或者点击菜单“文件 --》打开”),选择打开

在这里插入图片描述

3.3 根据上一步选择的目标语言是zn_CN.ts ,所以目标语言是中文即可(选择.ts文件是什么语言目标语言就是对应的该语言)

在这里插入图片描述

3.4 按如下步骤将所有文本翻译成对应语言(我这里是中文)

在这里插入图片描述

3.5 所有翻译完成后点击保存再发布

在这里插入图片描述

3.6 点击菜单栏的 文件 --》发布

在这里插入图片描述

3.7 在.ts文件夹下生成的.qm文件

在这里插入图片描述

3.8 该翻译文件完成,点击菜单栏的文件–》关闭 关闭该文件,再打开其它要翻译的文件

3.9 按上述步骤即可完成其它需要翻译的语言

4. 在项目中添加 加载 qm 文件、安装翻译器 qTranslator、翻译后刷新界面的代码

if (m_qTranslator == nullptr) {m_qTranslator = new QTranslator(this);
}
m_qTranslator ->load(":/res/language/en_US.qm");
qApp->installTranslator(m_qTranslator );
ui->retranslateUi(this);

示例代码:可直接放入工程测试

// mainwindow 登录界面

// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QTranslator>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();void on_btn_ch_clicked();void on_btn_en_clicked();private:Ui::MainWindow *ui;QTranslator *m_qTranslator = nullptr;
};
#endif // MAINWINDOW_H// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "info_win.h"
#include <QString>
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}
// 登录按钮的槽函数
void MainWindow::on_pushButton_clicked()
{// 获取输入的用户名和密码QString account = ui->lineEdit->text();QString pswd = ui->lineEdit_2->text();if(account == "aaa" && pswd == "123"){//创建第二个界面对象,必须传递this指针(把第一个界面的地址传给第二个界面)info_win *info_w = new info_win(this);qDebug()<<"第一界面的地址是"<<this;// 显示第二个界面info_w->show();//隐藏第一个界面/*隐藏:把界面转入到系统后台运行,这个界面对象依然存在关闭:界面释放掉,对象不存在了*/this->hide();}else{qDebug()<<"账号或密码错误,重新输入";}
}void MainWindow::on_btn_ch_clicked()
{if (nullptr == m_qTranslator) {m_qTranslator = new QTranslator(this);}m_qTranslator->load(":/res/language/zh_CN.qm");qApp->installTranslator(m_qTranslator);ui->retranslateUi(this);
}void MainWindow::on_btn_en_clicked()
{if (nullptr == m_qTranslator) {m_qTranslator = new QTranslator(this);}m_qTranslator->load(":/res/language/en_US.qm");qApp->installTranslator(m_qTranslator);ui->retranslateUi(this);
}

// info_win 信息界面

// info_win.cpp
#ifndef INFO_WIN_H
#define INFO_WIN_H#include <QMainWindow>namespace Ui {
class info_win;
}class info_win : public QMainWindow
{Q_OBJECTpublic:explicit info_win(QWidget *parent = nullptr);~info_win();private slots:void on_btn_back_clicked();private:Ui::info_win *ui;QWidget *save_mainwin;
};#endif // INFO_WIN_H// info_win.cpp
#include "info_win.h"
#include "ui_info_win.h"
#include <QDebug>
#include <QWidget>info_win::info_win(QWidget *parent) :QMainWindow(parent),ui(new Ui::info_win)
{ui->setupUi(this);save_mainwin = parent;qDebug()<<"传递过来的参数是第一个界面的地址:"<<parent;ui->label_dymText->setText(tr("手动设置文本"));
}info_win::~info_win()
{delete ui;
}
//返回上一级界面按钮的槽函数(第一个界面,登录界面)
void info_win::on_btn_back_clicked()
{//得到上一级界面的地址//思路1:当初创建第二个界面的时候,把第一个界面的地址通过构造函数传递过来//      定义的私有成员save_mainwin就是用来保存传递过来的第一个界面的地址// 显示上级界面
//    save_mainwin->show();//思路2:QT提供了一个函数,叫做parentWidget(),该函数用来返回上一级界面地址QWidget *main_win = this->parentWidget();main_win->show();qDebug()<<"main_win界面地址:"<<main_win;//关闭当前(第二个界面)界面delete this;    // this->close();
}

// .ui 文件
// mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>MainWindow</class><widget class="QMainWindow" name="MainWindow"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QLabel" name="label"><property name="geometry"><rect><x>250</x><y>20</y><width>351</width><height>81</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property><property name="text"><string>欢迎登录</string></property></widget><widget class="QLabel" name="label_2"><property name="geometry"><rect><x>160</x><y>140</y><width>121</width><height>41</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property><property name="text"><string>账号:</string></property></widget><widget class="QLabel" name="label_3"><property name="geometry"><rect><x>150</x><y>190</y><width>131</width><height>41</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property><property name="text"><string>密码:</string></property></widget><widget class="QLineEdit" name="lineEdit"><property name="geometry"><rect><x>290</x><y>150</y><width>131</width><height>31</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property></widget><widget class="QPushButton" name="pushButton"><property name="geometry"><rect><x>220</x><y>260</y><width>151</width><height>41</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property><property name="text"><string>登录</string></property></widget><widget class="QLineEdit" name="lineEdit_2"><property name="geometry"><rect><x>290</x><y>200</y><width>131</width><height>31</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property></widget><widget class="QPushButton" name="btn_ch"><property name="geometry"><rect><x>30</x><y>390</y><width>141</width><height>41</height></rect></property><property name="font"><font><family>Arial</family><pointsize>20</pointsize></font></property><property name="text"><string>中文</string></property></widget><widget class="QPushButton" name="btn_en"><property name="geometry"><rect><x>220</x><y>390</y><width>201</width><height>41</height></rect></property><property name="font"><font><family>Arial</family><pointsize>20</pointsize></font></property><property name="text"><string>英文</string></property></widget></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>23</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

// info_win.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>info_win</class><widget class="QMainWindow" name="info_win"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>600</height></rect></property><property name="windowTitle"><string>MainWindow</string></property><widget class="QWidget" name="centralwidget"><widget class="QPushButton" name="pushButton_2"><property name="geometry"><rect><x>90</x><y>140</y><width>100</width><height>40</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property><property name="text"><string>睡觉</string></property></widget><widget class="QPushButton" name="pushButton_3"><property name="geometry"><rect><x>90</x><y>210</y><width>171</width><height>40</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property><property name="text"><string>打游戏</string></property></widget><widget class="QPushButton" name="pushButton_4"><property name="geometry"><rect><x>90</x><y>90</y><width>100</width><height>40</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property><property name="text"><string>吃饭</string></property></widget><widget class="QPushButton" name="btn_back"><property name="geometry"><rect><x>260</x><y>60</y><width>381</width><height>51</height></rect></property><property name="font"><font><family>楷体</family><pointsize>20</pointsize></font></property><property name="text"><string>返回登录界面</string></property></widget><widget class="QLabel" name="label"><property name="geometry"><rect><x>90</x><y>300</y><width>91</width><height>61</height></rect></property><property name="font"><font><family>Arial</family><pointsize>18</pointsize></font></property><property name="text"><string>cat</string></property></widget><widget class="QLabel" name="label_2"><property name="geometry"><rect><x>90</x><y>390</y><width>91</width><height>61</height></rect></property><property name="font"><font><family>Arial</family><pointsize>18</pointsize></font></property><property name="text"><string>dog</string></property></widget><widget class="QLabel" name="label_3"><property name="geometry"><rect><x>240</x><y>300</y><width>91</width><height>61</height></rect></property><property name="font"><font><family>Arial</family><pointsize>18</pointsize></font></property><property name="text"><string>food</string></property></widget><widget class="QLabel" name="label_dymText"><property name="geometry"><rect><x>250</x><y>400</y><width>321</width><height>31</height></rect></property><property name="font"><font><family>Arial</family><pointsize>18</pointsize></font></property><property name="text"><string>TextLabel</string></property></widget></widget><widget class="QMenuBar" name="menubar"><property name="geometry"><rect><x>0</x><y>0</y><width>800</width><height>23</height></rect></property></widget><widget class="QStatusBar" name="statusbar"/></widget><resources/><connections/>
</ui>

代码框架:

在这里插入图片描述
在代码中设置的文本需要 tr()函数,标记为可翻译的
在这里插入图片描述
修改完后可在Qt-creator做发布(lrelease),会将所有在Qt预言家(linguist.exe)中翻译的.ts文件全部生成为.qm文件

在这里插入图片描述

现象:

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【差分】详解二维前缀和和差分问题

文章目录 1. 二维前缀和2. 公式推导3. LeetCode 304 二维区域和检索 - 矩阵不可变3.1 304 二维区域和检索 - 矩阵不可变3.2 LeetCode 1139 最大的以 1 为边界的正方形 4. 二维差分问题5. 二维差分的原理以及差分数组计算6. 题目6.1 牛客二维差分6.2 LeetCode 2132. 用邮票贴满网…

Unity 大型手游碰撞性能优化指南

Unity 大型手游碰撞性能优化指南 版本: 2.1 作者: Unity性能优化团队 语言: 中文 前言 在Unity大型手游的开发征途中,碰撞检测如同一位隐形的舞者,它在游戏的物理世界中赋予物体交互的灵魂。然而,当这位舞者的舞步变得繁复冗余时,便会悄然消耗宝贵的计算资源,导致帧率下…

【hive】函数集锦:窗口函数、列转行、日期函数

窗口函数 https://www.cnblogs.com/Uni-Hoang/p/17411313.html <窗口函数> OVER ([PARTITION BY <分组列> [, <分组列>...]][ORDER BY <排序列> [ASC | DESC] [, <排序列> [ASC | DESC]]...][<rows or range clause>]) )窗口函数主要是…

DAY 25 异常处理

目录 DAY 25 异常处理1.异常处理机制2.debug过程中的各类报错3.try-except机制4.try-except-else-finally机制作业&#xff1a;理解今日的内容即可&#xff0c;可以检查自己过去借助ai写的代码是否带有try-except机制&#xff0c;以后可以尝试采用这类写法增加代码健壮性。 DAY…

几何绘图与三角函数计算应用

几何绘图与三角函数计算应用 设计思路 左侧为绘图控制面板&#xff0c;右侧为绘图区域支持绘制点、线、矩形、圆、多边形等基本几何图形实现三角函数计算器&#xff08;正弦、余弦、正切等&#xff09;包含角度/弧度切换和常用数学常数历史记录功能保存用户绘图 完整实现代码…

CSS 定位:原理 + 场景 + 示例全解析

一. 什么是CSS定位? CSS中的position属性用于设置元素的定位方式,它决定了元素在页面中的"定位行为" 为什么需要定位? 常规布局(如 display: block)适用于主结构 定位适用于浮动按钮,弹出层,粘性标题等场景帮助我们精确控制元素在页面中的位置 二. 定位类型全…

GESP 二级复习参考 A

本教程完整包含&#xff1a; 5000字详细知识点解析 36个Python/C双语言示例 15个GESP真题及模拟题 8张专业图表和流程图 # C编程二级标准终极教程## 一、计算机存储系统深度解析### 1.1 存储体系架构 mermaid graph TDA[CPU寄存器] --> B[L1缓存 1-2ns]B --> C[L2缓…

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…

【人工智能 | 项目开发】Python Flask实现本地AI大模型可视化界面

文末获取项目源码。 文章目录 项目背景项目结构app.py(后端服务)index.html(前端界面)项目运行项目图示项目源码项目背景 随着人工智能技术的快速发展,大语言模型在智能交互领域展现出巨大潜力。本项目基于 Qwen3-1.7B 模型,搭建一个轻量化的智能聊天助手,旨在为用户提…

【设计模式】1.简单工厂、工厂、抽象工厂模式

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 以下是 简单工厂模式、工厂方法模式 和 抽象工厂模式 的 Python 实现与对比&#xff0c;结合代码示例和实际应用场景说明&#xff1a; 1. 简单工厂模式&a…

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…

01.SQL语言概述

SQL 语言概述 SQL &#xff08;Structured Query Language&#xff09;结构化査询语言 1. 关系型数据库的常见组件 数据库: database 表的集合&#xff0c;物理上表现为一个目录表: table&#xff0c;行: row 列: column索引: index视图: view&#xff0c;虚拟的表存储过程:…

C++学习-入门到精通【14】标准库算法

C学习-入门到精通【14】标准库算法 目录 C学习-入门到精通【14】标准库算法一、对迭代器的最低要求迭代器无效 二、算法1.fill、fill_n、generate和generate_n2.equal、mismatch和lexicographical_compare3.remove、remove_if、remove_copy和remove_copy_if4.replace、replace_…

Vue 项目实战:三种方式实现列表→详情页表单数据保留与恢复

背景&#xff1a;在Vue项目中&#xff0c;实现列表页跳转详情页并保留表单数据&#xff0c;返回时恢复表单状态。 核心功能&#xff1a; 保存缓存&#xff1a;点击查询按钮时&#xff0c;表单数据保存恢复缓存&#xff1a;从详情页返回时&#xff0c;恢复表单数据清除缓存&…

iptables实验

实验一&#xff1a;搭建web服务&#xff0c;设置任何人能够通过80端口访问。 1.下载并启用httpd服务器 dnf -y install httpd 开启httpd服务器 systemctl start httpd 查看是否启用 下载并启用iptables&#xff0c;并关闭firewalld yum install iptable…

Razor编程RenderXXX相关方法大全

文章目录 第一章&#xff1a;RenderXXX方法概述1.1 RenderXXX方法的作用与意义1.2 基本工作原理1.3 主要方法分类 第二章&#xff1a;部分视图渲染方法2.1 Html.RenderPartial()2.2 Html.RenderAction()2.3 性能对比分析 第三章&#xff1a;视图组件渲染方法3.1 Html.RenderCom…

Go 语言 range 关键字全面解析

Go 语言 range 关键字全面解析 range 是 Go 语言中用于迭代数据结构的关键字&#xff0c;支持多种数据类型的遍历操作。它提供了一种简洁、安全且高效的方式来处理集合类型的数据。 基本语法 for index, value : range collection {// 循环体 } 1. 数组/切片迭代 fruits :…

美化显示LLDB调试的数据结构

前面的博文美化显示GDB调试的数据结构介绍了如何美化显示GDB中调试的数据结构&#xff0c;本文将还是以mupdf库为例介绍如何美化显示LLDB中调试的数据结构。 先看一下美化后的效果&#xff1a; 一、加载自定义脚本 与GDB类似&#xff0c;需要添加一个~/.lldbinit文件&#xf…

【Java学习笔记】日期类

日期类 第一代日期类&#xff1a;Date 引入包 import java.text.ParseException&#xff1a;日期转换可能会抛出转换异常 import java.text.SimpleDateFormat import java.util.Date 1. 基本介绍 Date&#xff1a;精确到毫秒&#xff0c;代表特定的瞬间 SimpleDateForma…

C++基础进阶:函数、内联函数与Lambda函数详解

引言 在C编程的旅程中&#xff0c;函数是构建复杂程序的基本单元。它们像乐高积木一样&#xff0c;允许我们将代码分解成更小、更易于管理的部分。今天&#xff0c;我们将深入探讨C中的三种重要函数类型&#xff1a;普通函数、内联函数以及Lambda函数。掌握它们&#xff0c;将…