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

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'aaa.ui' # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! import sys, os from PyQt5 import QtCore, QtWidgets, QtGui from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5 import QtCore, QtGui, QtWidgets class U_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1204, 836) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.tableWidget = QtWidgets.QTableWidget(self.centralwidget) self.tableWidget.setGeometry(QtCore.QRect(80, 240, 1041, 371)) self.tableWidget.setAutoScrollMargin(9) self.tableWidget.setRowCount(9) self.tableWidget.setColumnCount(8) self.tableWidget.setObjectName("tableWidget") item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(1, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(2, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(3, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(4, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(5, item) item = QtWidgets.QTableWidgetItem() self.tableWidget.setVerticalHeaderItem(6, item) item = Q
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值