在使用Qt5.8完成程序动态语言切换时遇到的问题
因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文件,再通过网上介绍的方式,在 main函数中使用 installTranslator,即可让程序在启动时自动判断语言环境,加载相应语言。
至此,静态语言切换已经完成,下面要做的是动态切换(即不需要重启软件)。
1.首先,令语言能够切换的 GUI组件用的是 QComboBox,信号是 currentIndexChanged,在于这个信号对应的槽中加载不同的语言文件,安装 translator,并且调用主界面的retranslateUI函数。这样,每当下拉框的选中项发生改变时,语言就会立即切换,而不是像大多数软件一样需要再次点击“确定”后才会切换。但是这么做出现了问题,因为如果是使用 Qt Designer生成的界面,在自动生成的 retranslateUI程序(ui_**.h文件)中,会先调用 QComboBox类的 clear,再调用 insertItems函数,而这两个函数都会触发 currentIndexChanged信号。这样的话,就会产生一个死循环。
2.后来改成了点击“确定”后才会切换语言,这样也不需要再使用 QComboBox类的 currentIndexChanged信号,也就避开了上面的死循环。
3.只调用 retranslateUI函数时,则只有在 Qt Designer中输入的字符能够成功翻译。后来上网看别人的 Blog后知道,自己在代码中赋值的字符需要统一放到一个函数(retranslate)中,在安装好 translator后再调用这个函数。这样来看,Qt实现国际化的原理大致是,在显示字符时,会先从当前 translator中寻找该字符的翻译文本,有的话显示“翻译文本”,没有则显示“原本字符”。所以,由于一开始写程序时用的就是英文,英文的语言文本可以不做翻译,直接由 ts文件发布为 qm文件。
4.别人的 Blog中还写到:因为当调用 installTranslator后,会向所有的类发送一个 LanguageChanged事件。如果要实时切换另一个窗口的语言,就需要在另一个窗口类中重载 changeEvent,并判断事件是否是 LanguageChanged类型,是的话调用它的 retranslateUI函数,如果有字符是在代码中给出的,还需要自定义一个 retranslate函数,然后再调用这个函数。
5.一开始在自定义的 retranslate函数中,直接使用 setText(QApplication::translate("Mainwindow", "str", 0, QApplication::UnicodeUTF8)); 形式,报错。当前 Qt版本(5.8)下,则需要使用 setText(QApplication::translate("Mainwindow", "str",Q_NULLPTR)); 形式。
6.这样的话,每一个组件有两处字符串赋值的地方,不利于修改。我就想着可不可以只保留一处呢?看到 ui_**.h文件中的初始化函数中就会调用 retranslateUI函数,我就想着构造函数中就不对字符串赋值了,而都放到自定义的 retranslate函数中,在 Mainwindow的构造函数中调用 retranslate函数即可。可是这样 Qt Linguist就找不到这些需要翻译的字符了,然后在别人的代码中看到使用的是 setText(tr("---")); 形式。这样,就也能找到这些需要翻译的字符了。
7.但是出了一个很奇怪的问题,一开始是英文,英->中->英切换就没问题;一开始是中文的话,就切换不成英文。不知怎的,我就想到把程序启动时自动加载相应语言的代码改到 MainWindow的构造函数中,结果就好了。。。
在使用Qt5.8完成程序动态语言切换时遇到的问题的更多相关文章
- 动态语言切换(续)-designer中的retranslateUi(带源码)
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...
- 关于使用动态语言运行时 (. net)
AutoCAD Managed .NET API允许您使用使用. NET 4.0 引入的动态语言运行时 (DLR). 使用DLR可以直接访问对象, 而无需: 打开一个对象进行读取或写入, 然后在完成后 ...
- 《精通C#》第十六章-动态类型和动态语言运行时-第一节至第四节
在.Net4.0中引入了一个关键字dynamic,这是一个动态类型关键字.Net中还有一个关键字是var,这是一个隐式类型,可以定义本地变量,此时var所代表的实际的数据类型有编译器在初次分配时决定, ...
- 在SOUI中使用动态多语言切换
动态语言切换是很多国际化产品的需求,SOUI之前的版本支持静态多语言翻译,通过在程序启动时设置好语言翻译模块,在程序中打开的UI都会自动调用该翻译模块进行文字翻译,但是不支持运行进语言切换. 最近几个 ...
- 【C#表达式树 开篇】 Expression Tree - 动态语言
.NET 3.5中新增的表达式树(Expression Tree)特性,第一次在.NET平台中引入了"逻辑即数据"的概念.也就是说,我们可以在代码里使用高级语言的形式编写一段逻辑, ...
- 为什么可以说Java语言是准动态语言?
什么是动态语言? 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如JavaScript便是一个典型的动态语言. 除此之外如Ruby.Python ...
- 什么是动态语言 OC 的runtime
OC是一门 动态语言. 问题来了.什么是动态语言? 与之相对的静态语言? 学习C++的时候,记得一个名词:“运行时的动态绑定”. 这个是 “多态”的概念. 简单提一下:关键:类指针可以指向本类,或者其 ...
- Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈
一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同 ...
- C# 动态语言特性,dynamic 关键字研究
1 动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...
随机推荐
- BUILD FAILED D:\build.xml:2: 前言中不允许有内容。
1.错误描述 Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\Administ ...
- 存储过程 100w提交
create or replace procedure largedata_insert(ip_table_name in varchar2, --目标表 ip_table_column in v ...
- HTML基础加强
1. 什么是浏览器:解释和执行HTML源码的工具. 2. 什么是静态页面,什么样的页面是动态页面? 静态页面:htm,html(直接读取) 动态网页:asp,aspx,jsp,php(里面有代码请求时 ...
- 小程序版好友对战实战-wss部署与小程序用户登录时序
上一篇文章是对需求的分析,本次将逐渐进入代码阶段.本次主要的内容包括服务端wss的部署以及小程序端用户授权的时序及逻辑. wss的配置与部署 微信小程序出于安全考虑,要求所有涉及到网络的操作,必须使用 ...
- GridView中添加行单击事件.md
[toc] 1.使用说明 1.方法来源 该方法主要参考StackOverflow上面的答案和下面这篇文章 http://www.codeproject.com/Articles/15677/Click ...
- 【BZOJ3277】串(后缀自动机)
[BZOJ3277]串(后缀自动机) 题面 BZOJ 题解 广义后缀自动机??? 照着别人的打了一遍.. 相当于每个串都构建一个后缀自动机 构建完一个串之后,直接把当前的last指回root就行了?? ...
- luoguP2711 小行星
题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最少次数. 输入输出格式 输入格式: 第1行为小行星个数 ...
- Java 多线程异步处理demo
java中实现多线程 1)继承Thread,重写里面的run方法 2)实现runnable接口通过源码发现:第一种方法说是继承Tread然后重写run方法,通过查看run方法的源码,发现run方法里面 ...
- eclipse 精确查询
---恢复内容开始--- ctrl+H(一般都是这个,如果无效看你的自定义快捷键) 输入\b 查询的字符串 \b 后面的正则表达式选框必须选
- Lintcode249 Count of Smaller Number before itself solution 题解
[题目描述] Give you an integer array (index from 0 to n-1, where n is the size of this array, data value ...