目录
1,效果演示
2,第一步:将需要翻译的文本用:tr()函数封装
3,第二步:创建,并翻译:*.ts 文件,用翻译后的 *.ts 文件生成 *.qm文件
4,第三步:重写changeEvent函数
5,第四步:安装翻译器
6,代码
参考博客:https://blog.csdn.net/liang19890820/article/details/50276673
例如:
labelInfo = new QLabel(tr("人生苦短,我用 Qt!"), this);
(01):在工程文件:*.pro中添加以下代码:(根据自己需求,可以添加多个 *.ts 文件)
TRANSLATIONS += language_zh.ts \
language_en.ts
(02):生成 ts 文件:Qt Creator:工具 → 外部 → Qt预言家 → 更新翻译(lupdate)。
之后可以在工程栏中看到生成的 language_zh.ts 、language_en.ts 两个文件。如图:(如果没有在工程栏中显示,可以关闭工程后重新打开)。
(03):翻译 ts 文件:在工程栏中右击 language_zh.ts 、language_en.ts → 用...打开 → Qt Linguist. 打开、翻译,完成后保存。(直接启动Qt Linguist软件,打开并翻译ts文件也可以)。
(04):生成 qm 文件:Qt Creator:工具 → 外部 → Qt预言家 → 发布翻译(lrelease)。
(05):将生成的 qm 文件添加到资源文件。(如果不使用资源文件的方式,可以直接使用路径方式加载 qm 文件)
重写窗口的事件处理函数:void changeEvent(QEvent *event),接收并处理:QEvent::LanguageChange 事件。
void MyDialog::changeEvent(QEvent *event)
{
if(event->type() == QEvent::LanguageChange){
this->setWindowTitle(tr("子窗口"));
label->setText(tr("标签"));
checkBox->setText(tr("复选框"));
pushButton->setText(tr("按钮"));
}
else{
QWidget::changeEvent(event);
}
}
通常在 main 函数中进行。
...
QTranslator translator;
translator.load(":/language_zh.qm");
a.installTranslator(&translator); //安装翻译器
...
main.cpp
#include "mainwindow.h"
#include
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
translator.load(":/language_zh.qm");
a.installTranslator(&translator); //安装翻译器
MainWindow w;
w.setTranslator(&translator); //保存翻译器指针,用于动态翻译
w.show();
return a.exec();
}
mainwindow.h 、mainwindow.cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void setTranslator(QTranslator *translator);
void createDialog();
protected:
void changeEvent(QEvent *event);
private:
void translateUI();
void switchLanguage();
private:
Ui::MainWindow *ui;
QTranslator *m_translator;
QLabel *labelInfo;
QPushButton *btnCreateWindow;
QRadioButton *radioBtnZH;
QRadioButton *radioBtnEN;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
#include "mydialog.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->resize(300, 240);
this->setWindowTitle(tr("主窗口"));
labelInfo = new QLabel(tr("人生苦短,我用 Qt!"), this);
labelInfo->setAlignment(Qt::AlignHCenter);
labelInfo->setGeometry(20, 60, 260, 25);
radioBtnZH = new QRadioButton(tr("中文"), this);
radioBtnZH->setChecked(true);
radioBtnZH->setGeometry(20, 120, 80, 25);
radioBtnEN = new QRadioButton(tr("英文"), this);
radioBtnEN->setGeometry(100, 120, 80, 25);
btnCreateWindow = new QPushButton(tr("新建一个窗口"), this);
btnCreateWindow->setGeometry(180, 120, 100, 25);
connect(radioBtnZH, &QRadioButton::clicked, this, &MainWindow::switchLanguage);
connect(radioBtnEN, &QRadioButton::clicked, this, &MainWindow::switchLanguage);
connect(btnCreateWindow, &QPushButton::clicked, this, &MainWindow::createDialog);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::setTranslator(QTranslator *translator)
{
this->m_translator = translator;
}
void MainWindow::createDialog()
{
MyDialog *dlg = new MyDialog;
dlg->move(this->x()-dlg->width()-3, this->y());
dlg->show();
}
void MainWindow::changeEvent(QEvent *event)
{
if(event->type() == QEvent::LanguageChange)
this->translateUI();
else
QWidget::changeEvent(event);
}
void MainWindow::translateUI()
{
this->setWindowTitle(tr("主窗口"));
labelInfo->setText(tr("人生苦短,我用 Qt!"));
radioBtnZH->setText(tr("中文"));
radioBtnEN->setText(tr("英文"));
btnCreateWindow->setText(tr("新建一个窗口"));
}
void MainWindow::switchLanguage()
{
if(radioBtnZH->isChecked())
m_translator->load(":/language_zh.qm");
else if(radioBtnEN->isChecked())
m_translator->load(":/language_en.qm");
else
m_translator->load(":/language_zh.qm");
}
mydialog.h 、mydialog.cpp
#ifndef MYDIALOG_H
#define MYDIALOG_H
#include
#include
#include
#include
class MyDialog : public QDialog
{
Q_OBJECT
public:
MyDialog();
protected:
void changeEvent(QEvent *event);
private:
QLabel *label;
QCheckBox *checkBox;
QPushButton *pushButton;
};
#endif // MYDIALOG_H
#include "mydialog.h"
#include
#include
MyDialog::MyDialog()
{
this->resize(200, 100);
this->setAttribute(Qt::WA_DeleteOnClose);
this->setWindowTitle(tr("子窗口"));
label = new QLabel(tr("标签"), this);
label->setGeometry(20, 10, 120, 25);
checkBox = new QCheckBox(tr("复选框"), this);
checkBox->setGeometry(20, 40, 120, 25);
pushButton = new QPushButton(tr("按钮"), this);
pushButton->setGeometry(20, 70, 120, 25);
}
void MyDialog::changeEvent(QEvent *event)
{
if(event->type() == QEvent::LanguageChange){
this->setWindowTitle(tr("子窗口"));
label->setText(tr("标签"));
checkBox->setText(tr("复选框"));
pushButton->setText(tr("按钮"));
}
else{
QWidget::changeEvent(event);
}
}