目录
七、取消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();
}