当前位置: 首页 > news >正文

Qt动态更改界面语言(在运行状态下改变界面语言)

本文使用的Qt版本为5.9.9

概述

通常来说翻译文件都是在页面创建之前加载的,但也可以在不重启程序的情况下更改界面的语言。具体实现步骤如下:

  1. 将翻译文件的加载放在槽函数中进行,通过事件触发来改变。
  2. 在更改了翻译文件后,需要将程序中所有用户可见的字符串重新设置一遍。

实例

下面以实例来进行说明,界面如下,通过按钮来切换语言。我们需要准备一个翻译文件,将英文页面翻译为中文。完整的实例可以点击此处下载。
在这里插入图片描述
在按钮的槽函数中使用qApp->installTranslator来加载翻译文件,使用qApp->removeTranslator来删除翻译文件,因为我们的页面原来就是英文的(代码中使用的英文字符),所以调用removeTranslator删除后就会恢复默认。
widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QHBoxLayout>
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QHBoxLayout *hlayout = new QHBoxLayout();
    label = new QLabel(tr("language select:"));
    hlayout->addWidget(label);
    combo = new QComboBox();
    hlayout->addWidget(combo);
    ui->verticalLayout->insertLayout(0,hlayout);
    combo->addItem(tr("English"));
    combo->addItem(tr("Chinese"));

    translator = new QTranslator();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    qApp->removeTranslator(translator);

    if(combo->currentIndex() == 1) {
        //切换为中文
        qDebug()<<translator->load("samp16_cn.qm");
        qApp->installTranslator(translator);
    }

    //重新设置用户可见的字符,所有的控件,只要是用户能看到的字符,都要重新设置!
    label->setText(tr("language select:"));
    combo->setItemText(0,tr("English"));
    combo->setItemText(1,tr("Chinese"));
    //这个函数是Qt Designer自动生成的,跟上面我们自己写的重新设置控件字符串的函数相同,
    //所有通过Designer拖出来的控件,通过调用这个函数就可以重新设置了。
    ui->retranslateUi(this);
}

可以看到在更改了translator后,程序中所有控件中用户可见的字符都要重新设置一次,否则不会生效。这种方式的操作极为繁琐,所以在大的项目中都是在更改界面语言后要重启程序才行。

相关文章:

  • .gitignore文件---让git自动忽略指定文件
  • 解决QMYSQL driver not loaded问题
  • 信息安全之对称加密技术
  • 信息安全之非对称加密技术
  • 信息安全之数字信封原理
  • 信息安全之信息摘要技术
  • 信息安全技术之数字签名
  • 设置Mysql C API断线自动重连
  • mysql_query()和myql_real_query()的区别
  • mysql_store_result和mysql_use_result的区别
  • linux下实时跟踪文件变化tail指令
  • 解决windeployqt打包QML程序无法启动的问题
  • windows下如何找到占用文件或文件夹的程序
  • 正则表达式的零宽断言
  • 如何在Qt中使用zlib
  • JavaScript-如何实现克隆(clone)函数
  • Computed property XXX was assigned to but it has no setter
  • CSS相对定位
  • css选择器
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue.js 移动端适配之 vw 解决方案
  • 和 || 运算
  • 利用jquery编写加法运算验证码
  • 前言-如何学习区块链
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 详解移动APP与web APP的区别
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • puppet连载22:define用法
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • #预处理和函数的对比以及条件编译
  • ${ }的特别功能
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (LeetCode 49)Anagrams
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (算法)Travel Information Center
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转载)深入super,看Python如何解决钻石继承难题
  • ***测试-HTTP方法
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET上SQLite的连接
  • @Autowired多个相同类型bean装配问题
  • @Transient注解
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [1] 平面(Plane)图形的生成算法
  • [Assignment] C++1
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [CTSC2014]企鹅QQ
  • [ffmpeg] 定制滤波器
  • [Java安全入门]三.CC1链
  • [LeetBook]【学习日记】数组内乘积
  • [nginx] 网上最全面nginx教程(近100篇文章整理)