目录
1,效果演示
2,第一步:将需要翻译的文本用:tr()函数封装
3,第二步:创建,并翻译:*.ts 文件,用翻译后的 *.ts 文件生成 *.qm文件
4,第三步:重写changeEvent函数
5,第四步:安装翻译器
6,代码
参考博客:https://blog.csdn.net/liang19890820/article/details/50276673
1,效果演示
2,第一步:将需要翻译的文本用:tr()函数封装
例如:
labelInfo = new QLabel(tr("人生苦短,我用 Qt!"), this);
3,第二步:创建,并翻译:*.ts 文件,用翻译后的 *.ts 文件生成 *.qm文件
(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 文件)
4,第三步:重写changeEvent函数
重写窗口的事件处理函数: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);}
}
5,第四步:安装翻译器
通常在 main 函数中进行。
...QTranslator translator;translator.load(":/language_zh.qm");a.installTranslator(&translator); //安装翻译器
...
6,代码
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QTranslator>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 <QMainWindow>
#include <QTranslator>
#include <QLabel>
#include <QPushButton>
#include <QRadioButton>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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 <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QRadioButton>
#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();elseQWidget::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");elsem_translator->load(":/language_zh.qm");
}
mydialog.h 、mydialog.cpp
#ifndef MYDIALOG_H
#define MYDIALOG_H#include <QDialog>
#include <QLabel>
#include <QCheckBox>
#include <QPushButton>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 <QEvent>
#include <QLabel>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);}
}