QT中英文语言动态切换_动态多窗口语言切换

目录

一、最终效果展示

二、本例使用的QT版本与调试器

三、本例文件与代码展示

四、生成translation_cn.ts文件

五、使用Linguist 打开ts文件进行翻译并保存

六、生成translation_cn.qm文件

七、取消mainwindow.cpp中的代码屏蔽并重新构建运行

八、下载地址


一、最终效果展示

图1-1 最终效果

二、本例使用的QT版本与调试器

图2-1 Qt版本与调试器

        如图2-1所示,本例使用Qt Creator 4.11.1,调试器为MSVC 2017 32bit。 一定要确保Qt Creator和调试器配置成功,否则后续相关步骤无法进行下去。若是刚开始学习Qt,且Qt未配置成功,可以参考我的另一篇文章(http://t.csdn.cn/2n05c),有介绍我的Qt Creator版本与配置,过程简单易懂。

三、本例文件与代码展示

 

图3-1 例子文件

        如图3-1所示,项目名称为“MainWindowTranslator”,包含两个UI文件,form.ui为Widget类型窗口,mainwindow.ui为MainWindow类型窗口。

MainWindowTranslator.pro代码如下:

文件中需加入:TRANSLATIONS = \
        translation_cn.ts

        translation_cn.ts为保存英文的翻译文件,里面为中文到英文的翻译的类容和对应关系。

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    form.cpp \
    global.cpp \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    form.h \
    global.h \
    mainwindow.h

FORMS += \
    form.ui \
    mainwindow.ui

TRANSLATIONS = \
    translation_cn.ts

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    Resource.qrc

 main.cpp代码如下:

#include "mainwindow.h"

#include <QApplication>
#include "global.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

mainwindow.h代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <form.h>
#include "global.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    Form *widgetForm;
    QMenu *menu;
    QAction *enAction;
    QAction *cnAction;

public slots:
    void EnLanguageTranslation();
    void CnLanguageTranslation();
    void RetranslationUi();
signals:
    void emitRereshUi();
};
#endif // MAINWINDOW_H

mainwindow.cpp代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    widgetForm = new Form;
    menu = new QMenu;
    enAction = new QAction;
    menu->addAction(enAction);
    connect(enAction,&QAction::triggered,this,&MainWindow::EnLanguageTranslation);

    cnAction = new QAction;
    menu->addAction(cnAction);
    menuBar()->addMenu(menu);
    connect(cnAction,&QAction::triggered,this,&MainWindow::CnLanguageTranslation);

    connect(this,&MainWindow::emitRereshUi,widgetForm,&Form::RetranslatUi);

    RetranslationUi();
}

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


void MainWindow::on_pushButton_clicked()
{
    if(widgetForm->isHidden())
    {
        ui->pushButton->setText(tr("关闭窗口"));
        widgetForm->show();
    }
    else
    {
        ui->pushButton->setText(tr("显示窗口"));
        widgetForm->hide();
    }
}

void MainWindow::EnLanguageTranslation()
{
    qApp->removeTranslator(tran);
    delete tran;

    tran = new QTranslator;
    //tran->load("translation_cn.qm",":/translations");
    //qApp->installTranslator(tran); //此处两行暂时屏蔽,因还未更新和发布翻译,暂时无ts和qm文件
    ui->retranslateUi(this);
    RetranslationUi();
    emit emitRereshUi();
}
void MainWindow::CnLanguageTranslation()
{
    qApp->removeTranslator(tran);
    delete tran;
    tran = new QTranslator;
    //tran->load("translation_cn.qm",":/translations");//此处一行暂时屏蔽,因还未更新和发布翻译,暂时无ts和qm文件
    ui->retranslateUi(this);
    RetranslationUi();
    emit emitRereshUi();
}

void MainWindow::RetranslationUi()
{

    menu->setTitle(tr("语言"));
    enAction->setText(tr("英文"));
    cnAction->setText(tr("中文"));
    if(widgetForm->isHidden())
    {
        ui->pushButton->setText(tr("显示窗口"));
    }
    else
    {
        ui->pushButton->setText(tr("关闭窗口"));
    }
}

form.h代码如下:

#ifndef FORM_H
#define FORM_H

#include <QWidget>
#include <QLabel>
#include <QVBoxLayout>

namespace Ui {
class Form;
}

class Form : public QWidget
{
    Q_OBJECT

public:
    explicit Form(QWidget *parent = nullptr);
    ~Form();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Form *ui;
    QLabel *labels;
    QVBoxLayout *vBoxLayout;
public slots:
    void RetranslatUi();
};

#endif // FORM_H

form.cpp代码如下:

#include "form.h"
#include "ui_form.h"

Form::Form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Form)
{
    ui->setupUi(this);
    labels = new QLabel;
    vBoxLayout = new QVBoxLayout(this);
    vBoxLayout->addWidget(labels);
    vBoxLayout->addWidget(ui->label);
    vBoxLayout->addWidget(ui->pushButton);

    RetranslatUi();
}

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

void Form::on_pushButton_clicked()
{
    this->hide();
}

void Form::RetranslatUi()
{
    ui->retranslateUi(this);
    labels->setText(tr("代码标签"));
}

 global.h代码如下:

#include <QTranslator>

extern QTranslator *tran;

global.cpp代码如下:

#include "global.h"
QTranslator *tran = NULL;

form.ui布局如下:

图3-2 form.ui布局

mainwindow.ui布局如下:

 图3-3 mainwindow.ui布局 

四、生成translation_cn.ts文件

1.“重新构建”项目;

2.构建成功后,点击【更新翻译(lupdate)】(位于:工具》外部》Qt语言家 的菜单下)生成translation_cn.ts文件。生成的文件位于项目文件夹里面。

 图4-1 translation_cn.ts文件

五、使用Linguist 打开ts文件进行翻译并保存

        如图5-1,打开对应调试器版本的Linguist软件,此处为Linguist 5.14.2 (MSVC 2017 32-bit)。

 

图5-1 Linguist软件 

图5-2 Linguist翻译软件界面说明 

         如图5-2所示,翻译完成后所有汉字段前面都是绿色钩,然后保存关闭Linguist软件。

六、生成translation_cn.qm文件

         点击【发布翻译(lrelease)】(位于:工具》外部》Qt语言家 的菜单下)生成translation_cn.qm文件。生成的文件位于项目文件夹里面,与ts文件位置一样。

        在ts所在文件夹中新建translations文件夹,并将translation_cn.qm文件拷贝到translations文件夹中,并在Qt Creator中新建资源文件Resource.qrc,并将qm文件添加进去,如图6-1所示。

图6-1 资源文件夹

七、取消mainwindow.cpp中的代码屏蔽并重新构建运行

         如下代码所示,取消之前屏蔽部分,再重新构建并运行就能看到标题一中的最终效果。

void MainWindow::EnLanguageTranslation()
{
    qApp->removeTranslator(tran);
    delete tran;

    tran = new QTranslator;
    tran->load("translation_cn.qm",":/translations");
    qApp->installTranslator(tran); //解除屏蔽后构建成功并运行,因为此时已有qm文件
    ui->retranslateUi(this);
    RetranslationUi();
    emit emitRereshUi();
}
void MainWindow::CnLanguageTranslation()
{
    qApp->removeTranslator(tran);
    delete tran;
    tran = new QTranslator;
    tran->load("translation_cn.qm",":/translations");//解除屏蔽后构建成功并运行,因为此时已有qm文件
    ui->retranslateUi(this);
    RetranslationUi();
    emit emitRereshUi();
}

八、下载地址

https://download.csdn.net/download/weixin_44322043/85074903 

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

99.999...%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值