因为之前了解过一些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完成程序动态语言切换时遇到的问题的更多相关文章

  1. 动态语言切换(续)-designer中的retranslateUi(带源码)

    本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...

  2. 关于使用动态语言运行时 (. net)

    AutoCAD Managed .NET API允许您使用使用. NET 4.0 引入的动态语言运行时 (DLR). 使用DLR可以直接访问对象, 而无需: 打开一个对象进行读取或写入, 然后在完成后 ...

  3. 《精通C#》第十六章-动态类型和动态语言运行时-第一节至第四节

    在.Net4.0中引入了一个关键字dynamic,这是一个动态类型关键字.Net中还有一个关键字是var,这是一个隐式类型,可以定义本地变量,此时var所代表的实际的数据类型有编译器在初次分配时决定, ...

  4. 在SOUI中使用动态多语言切换

    动态语言切换是很多国际化产品的需求,SOUI之前的版本支持静态多语言翻译,通过在程序启动时设置好语言翻译模块,在程序中打开的UI都会自动调用该翻译模块进行文字翻译,但是不支持运行进语言切换. 最近几个 ...

  5. 【C#表达式树 开篇】 Expression Tree - 动态语言

    .NET 3.5中新增的表达式树(Expression Tree)特性,第一次在.NET平台中引入了"逻辑即数据"的概念.也就是说,我们可以在代码里使用高级语言的形式编写一段逻辑, ...

  6. 为什么可以说Java语言是准动态语言?

    什么是动态语言? 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如JavaScript便是一个典型的动态语言. 除此之外如Ruby.Python ...

  7. 什么是动态语言 OC 的runtime

    OC是一门 动态语言. 问题来了.什么是动态语言? 与之相对的静态语言? 学习C++的时候,记得一个名词:“运行时的动态绑定”. 这个是 “多态”的概念. 简单提一下:关键:类指针可以指向本类,或者其 ...

  8. Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈

    一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同 ...

  9. C# 动态语言特性,dynamic 关键字研究

    1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...

随机推荐

  1. C# 时间格式化大全

    DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25        Label2.Text = dt ...

  2. Django学习-14-分页功能实例

    首先创建一个制作page的工具类                     utils                         --page_make.py                    ...

  3. CentOS6.5 [ERROR] /usr/libexec/mysqld: Can't create/write to file '/var/lib/mysqld/mysqld.pid' (Errcode: 2)

    环境是CentOS6.5,先贴个错误代码: 这个问题解决了大半天,浪费了好多时间,不过也算是值了. 事故起因是因为突然断电,mysql server直接干掉了,也没有备用电源,重启了之后看日志tail ...

  4. Unity3d 截屏保存到相册,并且刷新相册

    要做一个截图的功能,并且玩家可以在相册中看到. 做的时候遇到了三个问题: 1.unity自带的截图API,Application.CaptureScreenshot在Android上不生效 2.图片保 ...

  5. 创建元素节点createElement

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. [Luogu2057]善意的投票

    题目戳我 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投 ...

  7. [BZOJ1012] [JSOI2008] 最大数maxnumber (ST表)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  8. Nginx负载均衡——基础功能

    熟悉Nginx的小伙伴都知道,Nginx是一个非常好的负载均衡器.除了用的非常普遍的Http负载均衡,Nginx还可以实现Email,FastCGI的负载均衡,甚至可以支持基于Tcp/UDP协议的各种 ...

  9. 关于 CI框架访问数据库类提示Call to undefined function mysqli_init() 问题解决

    我上次实践发现,安装在Win10 WampServer3.0.4集成环境,不仅打不开phpmyadmin会报错就算了,而且报错后又没提示那么解决,同时你打开php扩展配置发现,WampServer系统 ...

  10. java 实现登录验证码 (kaptcha 验证码组件)

    验证码的作用: 1.防止广告机注册和发帖.评论.2.防止暴力破解密码,特别是有管理员权限的密码. 在这里介绍一种非常实用的验证码生成工具:kaptcha 这个工具,可以生成各种样式的验证码,因为它是可 ...