QT非UI设计器生成界面的国际化

目的

UI设计器生成界面的国际化,比较容易实现些,因为有现成的函数可以调用,基本过程如下:

void MainWindow::on_actLang_CN_triggered()
{//中文界面qApp->removeTranslator(trans);delete trans;trans=new QTranslator;trans->load("samp16_1_cn.qm");qApp->installTranslator(trans);ui->retranslateUi(this);QSettings   settings("WWB-Qt","samp16_1"); //注册表键组settings.setValue("Language","CN"); //界面语言,汉语
}
void MainWindow::on_actLang_EN_triggered()
{//英文界面qApp->removeTranslator(trans);delete trans;trans=new QTranslator;trans->load("samp16_1_en.qm");qApp->installTranslator(trans);ui->retranslateUi(this);QSettings   settings("WWB-Qt","samp16_1"); //注册表键组settings.setValue("Language","EN"); //界面语言,英语
}

直接调用相应的函数就可以了。
但手动编写代码的界面如何实现这些呢?
比如这个界面:

Widget::Widget(QWidget *parent): QWidget(parent),trans(nullptr)
{QLabel* label = new QLabel(QString::fromUtf8("widget_处理"));label->setStyleSheet("QLabel{font:60px}");QHBoxLayout* layoutMain = new QHBoxLayout();this->setLayout(layoutMain);//layoutMain->addWidget(label);layoutMain->setContentsMargins(0,0,0,0);QFrame *mainFrame = new QFrame();layoutMain->addWidget(mainFrame);QHBoxLayout* layoutMainFrame = new QHBoxLayout();layoutMainFrame->setContentsMargins(0,0,0,0);mainFrame->setLayout(layoutMainFrame);//帮助QFrame *helpFrame = new QFrame();QHBoxLayout* layoutHMenu1 = new QHBoxLayout();layoutHMenu1->setContentsMargins(0,0,0,0);layoutHMenu1->setSpacing(0);//1/打开帮助m_btnOpenHelp = new QToolButton();m_btnOpenHelp->setText(tr("打开帮助"));m_btnOpenHelp->setMaximumWidth(60);layoutHMenu1->addWidget(m_btnOpenHelp);//帮助小分类QLabel *lable1_1 = new QLabel(this);lable1_1->setText(tr("帮助"));lable1_1->setMaximumHeight(20);lable1_1->setAlignment(Qt::AlignCenter);QVBoxLayout* layoutVMenu1 = new QVBoxLayout();layoutVMenu1->setContentsMargins(0,0,0,0);layoutVMenu1->setSpacing(0);layoutVMenu1->addLayout(layoutHMenu1);layoutVMenu1->addWidget(lable1_1);helpFrame->setLayout(layoutVMenu1);layoutMainFrame->addWidget(helpFrame);//关于QFrame *aboutFrame = new QFrame();QHBoxLayout* layoutHMenu2 = new QHBoxLayout();layoutHMenu2->setContentsMargins(0,0,0,0);layoutHMenu2->setSpacing(0);//1/关于m_btnOpenAbout = new QToolButton();m_btnOpenAbout->setText(tr("关于"));m_btnOpenAbout->setMaximumWidth(60);layoutHMenu2->addWidget(m_btnOpenAbout);m_btnTranslate = new QToolButton();m_btnTranslate->setText(tr("翻译"));QObject::connect(m_btnTranslate,SIGNAL(clicked(bool)),this,SLOT(on_btnTranslate_clicked(bool)));m_btnTranslate->setMaximumWidth(60);layoutHMenu2->addWidget(m_btnTranslate);//关于小分类m_lable2_1 = new QLabel(this);m_lable2_1->setText(tr("关于"));m_lable2_1->setMaximumHeight(20);m_lable2_1->setAlignment(Qt::AlignCenter);QVBoxLayout* layoutVMenu2 = new QVBoxLayout();layoutVMenu2->setContentsMargins(0,0,0,0);layoutVMenu2->setSpacing(0);layoutVMenu2->addLayout(layoutHMenu2);layoutVMenu2->addWidget(m_lable2_1);aboutFrame->setLayout(layoutVMenu2);layoutMainFrame->addWidget(aboutFrame);//最后加弹簧QSpacerItem *spacer = new QSpacerItem(10, 20,QSizePolicy::Expanding,QSizePolicy::Minimum);layoutMainFrame->addItem(spacer);
}

这个界面是没有retranslateUi()这个函数的。
说说QT国际化的概念:
QT国际化(Internationalization,简称I18N)是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。
这使得软件能够在不同的国家和地区使用,并且可以根据用户的语言和地区提供本地化的使用体验。
QT是一种跨平台的应用程序开发框架,提供了很多工具和功能来支持国际化。

过程

先看看,ui的这个函数到底做了什么,我们可以模仿这一个函数实现相应的功能,充分利用QT框架的东西:
在这里插入图片描述

原来是重新设置了一下文本相关的东西。
这让我们可以知道,执行了这段代码后:

qApp->removeTranslator(trans);delete trans;trans=new QTranslator;trans->load("samp16_1_cn.qm");qApp->installTranslator(trans);

语言已经翻译完了,但需要把翻译的结果,再放到界面上去,如果放到界面上去,就是需要手动的设置这些控件的文本,感觉有些笨似的,然而,却只能这样;如果用Ui设置器的话,Qt界面设计器会为我们自动生成这些代码,但我们没有用Qt界面设计器,所以也没有这些函数,只有我们自己去实现这些函数。
先看实现的效果:
在这里插入图片描述
在这里插入图片描述
我们是这样实现的:
首先是“翻译”按钮的实现逻辑:

void Widget::on_btnTranslate_clicked(bool checked)
{static bool isChinese = true;if(isChinese){qDebug()<<"isChinese="<<isChinese;if(trans){qApp->removeTranslator(trans);delete trans;}QString appDirPath = QCoreApplication::applicationDirPath();//QString fileName = appDirPath+"//translate1_cn.qm";QString fileName = QString(":/translate/translate1_cn.qm");trans=new QTranslator;trans->load(fileName);qApp->installTranslator(trans);qApp->processEvents();//this->update();isChinese = false;}else{qDebug()<<"isChinese="<<isChinese;if(trans){qApp->removeTranslator(trans);delete trans;}QString appDirPath = QCoreApplication::applicationDirPath();QString fileName = QString(":/translate/translate1_en.qm");//QString fileName = appDirPath+"//translate1_en.qm";trans=new QTranslator;trans->load(fileName);qApp->installTranslator(trans);qApp->processEvents();isChinese = true;}//ui->retranslateUi(this);
}

这个逻辑很简单,就是利用QT的函数实现了翻译工作,但是少了retranslateUi()函数的实现,如何实现这一个函数呢?
先定义一个事件:

void Widget::changeEvent(QEvent *event)
{if (event->type() == QEvent::LanguageChange) {retranslateUi();  // 语言变化时更新界面}QWidget::changeEvent(event);
}

再实现retranslateUi()函数:

void Widget::retranslateUi()
{m_btnOpenAbout->setText(tr("关于"));m_btnOpenHelp->setText(tr("打开帮助"));m_lable2_1->setText(tr("关于"));m_btnTranslate->setText(tr("翻译"));
}

这样就实现了翻译工作。
效果如下:

Qt界面国际化1

总结

用QT开发多语言界面程序,主要包括以下几个步骤
1)在程序设计阶段,程序代码中每一个用户可见的字符串都有tr()函数封装
2)在项目配置文件(.pro文件)中设置需要导出的翻译文件(.ts文件),使用lupdate工具扫描项目文件 中需要翻译的字符串,并生成翻译文件
3)使用Qt的Linguist程序打开后成的翻译文件,将程序中的字符串翻译为需要的语言,如将所中文字符串翻译为英文
4)使用lrelease工具编译翻译好的翻译文件,生成更为紧凑的".qm"文件。
5)在应用程序中用QTranslator调用不两年的".qm"文件,实现不同的语言界面。
关于手写代码界面的翻译,有如下关键部分:
翻译事件:

[virtual protected] void QWidget::changeEvent(QEvent *event)
This event handler can be reimplemented to handle state changes.
The state being changed in this event can be retrieved through the event supplied.
Change events include: QEvent::ToolBarChange, QEvent::ActivationChange, QEvent::EnabledChange, QEvent::FontChange, 
QEvent::StyleChange, QEvent::PaletteChange, QEvent::WindowTitleChange, QEvent::IconTextChange, QEvent::ModifiedChange, 
QEvent::MouseTrackingChange, QEvent::ParentChange,QEvent::WindowStateChange, QEvent::LanguageChange, QEvent::LocaleChange, QEvent::LayoutDirectionChange, QEvent::ReadOnlyChange.

这个过程体现了QT事件的灵活应用:
在这里插入图片描述

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

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

相关文章

Hackme靶机通关攻略

1&#xff0c;打开靶机和kali&#xff0c;在kali终端中扫描靶机ip,得到靶机ip为192.168.50.137 arp-scan -l 2&#xff0c;使用工具扫描出后台目录后访问login.php 3&#xff0c;注册后登陆发现有输入框&#xff0c;可以尝试使用sql注入来得到用户名和密码&#xff0c;密码需要…

国产编辑器EverEdit - 工具栏自定义及认识工具栏上的按钮

1 设置-高级-工具条 1.1 设置说明 1.1.1 工具条自定义 选择主菜单工具 -> 设置 -> 常规&#xff0c;在弹出的选项窗口中选择工具条分类&#xff0c;如下图所示&#xff1a; 左侧窗口是当前支持所有功能按钮列表(上图中居中栏)&#xff0c;右侧的窗口是当前显示在工具栏…

docker安装rabbitmq

第一步直接dokce拉取rabbitmq镜像docker 利用docker直接拉取镜像最新版&#xff1a;docker search rabbitmq 运行mq&#xff1a; 需要注意的是-p 5673:5672 解释&#xff1a;-p 外网端口&#xff1a;docker的内部端口 &#xff0c;你们可以改成自己的外网端口号&#xff0c;我这…

【实战ES】实战 Elasticsearch:快速上手与深度实践-8.2.2成本优化与冷热数据分离

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 8.2.2AWS OpenSearch Serverless 成本优化与冷热数据分离深度实践1. 成本构成分析与优化机会识别1.1 Serverless模式成本分布1.2 冷热数据特征分析数据特征矩阵 2. 冷热数据…

安卓edge://inspect 和 chrome://inspect调试移动设备上的网页

edge://inspect 和 chrome://inspect 是用于调试浏览器中运行的网页和移动设备上的网页的工具。这两个工具分别属于 Microsoft Edge 和 Google Chrome 浏览器。以下是它们的详细介绍&#xff1a; chrome://inspect 如果是直接使用数据线调试&#xff0c;则只需要执行下面的第一…

checkpoint机制

1、什么是checkpoint 将缓冲池中的脏页刷新到磁盘&#xff0c;并更新redo log的checkpoint位点&#xff0c;确保数据库在发生故障时可以快速恢复到一致的状态。 2、checkpoint执行过程 确保需要刷新的脏页&#xff1a;从缓冲池中选取一部分需要刷新的页数据页刷新&#xff1…

【微服务日志收集①】使用FileBeat+Logstash+ES搭建ELK日志系统

使用FileBeatLogstashES搭建ELK日志系统&#xff0c;架构图如下&#xff1a; 1、 使用docker快速创建ES服务和Kibana服务 前置条件&#xff1a;需要在linux上提前安装好docker和docker-compose 1.1、在linux创建好一个用于存放docker-compose配置文件的文件夹 我的目录是/app/…

Centos 7 安装达梦数据库

一、环境准备 1. 确认操作系统的版本和数据库的版本是否一致 cat /etc/redhat-release 2. 关闭防火墙 查看防火墙状态 firewall-cmd --state 停止firewall systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.service 3. 修改文件l…

仿“东方甄选”直播商城小程序运营平台

在公域直播流量红利趋于饱和、流量成本大幅攀升的当下&#xff0c;私域直播为企业开辟了新的流量聚集和转化渠道&#xff0c;特别是对于那些希望在私域流量领域取得突破的品牌商家来说&#xff0c;直播场景以其独特的高频互动氛围&#xff0c;相比其他运营方式&#xff0c;展现…

ZED X系列双目3D相机的耐用性与创新设计解析

在工业自动化和学术研究领域&#xff0c;高精度的视觉设备正成为提升效率和质量的关键。ZED X系列AI立体相机&#xff0c;凭借其先进的技术和耐用的设计&#xff0c;为这一领域带来了新的可能。 核心技术&#xff1a;深度感知与精准追踪 ZED X系列的核心技术之一是Neural Dept…

Cursor的使用感受,帮你使用好自动化编程工具,整理笔记

使用感受 说实话&#xff0c;我觉得cursor还是好用的&#xff0c;可能我刚开始使用&#xff0c;没有使用的非常的熟练&#xff0c;运用也没有非常的透彻&#xff0c;总体体验还是不错的&#xff0c;在使用它时&#xff0c;我优先考虑&#xff0c;前端页面功能复用的时候&#…

《C#上位机开发从门外到门内》3-5:基于FastAPI的Web上位机系统

文章目录 一、项目概述二、系统架构设计三、前后端开发四、数据可视化五、远程控制六、系统安全性与稳定性七、性能优化与测试八、实际应用案例九、结论 随着互联网技术的快速发展&#xff0c;Web上位机系统在工业自动化、智能家居、环境监测等领域的应用日益广泛。基于FastAPI…

vue3单独引用element-plus的Infinite Scroll无限滚动;vue3自定义指令

文章目录 1.正常单独使用element-plus其他功能组件2.引入类似与指令的插件3.自定义指令钩子 1.正常单独使用element-plus其他功能组件 引入即可使用 import { ElSelect, ElOption } from "element-plus"2.引入类似与指令的插件 需要先引入&#xff0c;再注册&…

CMake学习笔记(二):变量设值,源文件/文件查找

一_变量设值: 在上一节中我们知道了如何去链接起来多个源文件并且生成可执行文件&#xff0c;但是当我们的源文件过多的时候会导致我们在add_executable里面写很长的一串&#xff0c;所以我们可以使用变量来进行设值: set(<variable> <value>... [PARENT_SCOPE])…

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 【Function】Azure Function通过托管身份或访问令牌连接Azu…

案例5_1:单位数码管显示0

文章目录 文章介绍效果图仿真图5_1放置单位数码管 代码5_1.c 文章介绍 效果图 仿真图5_1 复制案例1_2的仿真图&#xff0c;在此基础上修改 注意&#xff1a;栅格大小需要缩小 放置单位数码管 代码5_1.c #include <reg52.h>#define uchar unsigned char #define uint un…

helm部署metricbeat

背景 在Elastic Stack 7.5版本之前&#xff0c;系统默认采用内置服务进行监控数据采集&#xff08;称为内部收集机制&#xff09;&#xff0c;这种设计存在显著局限性&#xff1a; 当ES集群崩溃时自带的节点监控也会随之崩溃&#xff0c;直到集群恢复前&#xff0c;崩溃期间的…

基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)

1. 前言 在数据分析和网络爬虫的应用场景中&#xff0c;我们经常需要获取社交媒体平台的数据&#xff0c;例如 TikTok。本篇文章介绍如何使用 Python 爬取 TikTok 用户搜索数据&#xff0c;并解析其返回的数据。 结果截图 2. 项目环境准备 在正式运行代码之前&#xff0c;我…

阿里云、腾讯云云主机如何提升远程桌面安全(VNC登录)

远程桌面连接&#xff08;RDP&#xff09;是管理主机的常用方式&#xff0c;但同时也带来了安全风险。黑客会对远程桌面进行暴力破解攻击和撞库攻击。作为云主机&#xff0c;在远程桌面方面有天然的安全优势&#xff1a;可以关闭远程桌面服务或端口&#xff0c;限制只能通过网页…

【etcd】

一、ETCD 简介 etcd是一个由CoreOS团队开发的开源项目&#xff0c;旨在提供一个高可用的、分布式的、一致的键值存储&#xff0c;用于配置共享和服务发现。尽管它看起来像一个键值存储&#xff0c;但etcd的设计目标远远超出了传统数据库的功能范围。 etcd的核心特性包括&…