当前位置: 首页 > news >正文

QT非UI设计器生成界面的国际化

目的

UI设计器生成界面的国际化,比较容易实现些,因为有现成的函数可以调用,基本过程如下:

void MainWindow::on_actLang_CN_triggered()
{//中文界面
    qApp->removeTranslator(trans);
    delete trans;
    trans=new QTranslator;
    trans->load("samp16_1_cn.qm");
    qApp->installTranslator(trans);
    ui->retranslateUi(this);
    QSettings   settings("WWB-Qt","samp16_1"); //注册表键组
    settings.setValue("Language","CN"); //界面语言,汉语
}
void MainWindow::on_actLang_EN_triggered()
{//英文界面
    qApp->removeTranslator(trans);
    delete trans;
    trans=new QTranslator;
    trans->load("samp16_1_en.qm");
    qApp->installTranslator(trans);
    ui->retranslateUi(this);
    QSettings   settings("WWB-Qt","samp16_1"); //注册表键组
    settings.setValue("Language","EN"); //界面语言,英语
}

直接调用相应的函数就可以了。
但手动编写代码的界面如何实现这些呢?
比如这个界面:

Widget::Widget(QWidget *parent)
    : QWidget(parent),trans(nullptr)
{
    QLabel* label = new QLabel(QString::fromUtf8("widget_处理"));
    label->setStyleSheet("QLabel{font:60px}");
    QHBoxLayout* layoutMain = new QHBoxLayout();
    this->setLayout(layoutMain);
    //layoutMain->addWidget(label);
    layoutMain->setContentsMargins(0,0,0,0);
    QFrame *mainFrame = new QFrame();
    layoutMain->addWidget(mainFrame);
    QHBoxLayout* layoutMainFrame = new QHBoxLayout();
    layoutMainFrame->setContentsMargins(0,0,0,0);
    mainFrame->setLayout(layoutMainFrame);
    //帮助
    QFrame *helpFrame = new QFrame();
    QHBoxLayout* layoutHMenu1 = new QHBoxLayout();
    layoutHMenu1->setContentsMargins(0,0,0,0);
    layoutHMenu1->setSpacing(0);
    //1/打开帮助
    m_btnOpenHelp = new QToolButton();
    m_btnOpenHelp->setText(tr("打开帮助"));
    m_btnOpenHelp->setMaximumWidth(60);
    layoutHMenu1->addWidget(m_btnOpenHelp);
    //帮助小分类
    QLabel *lable1_1 = new QLabel(this);
    lable1_1->setText(tr("帮助"));
    lable1_1->setMaximumHeight(20);
    lable1_1->setAlignment(Qt::AlignCenter);
    QVBoxLayout* layoutVMenu1 = new QVBoxLayout();
    layoutVMenu1->setContentsMargins(0,0,0,0);
    layoutVMenu1->setSpacing(0);
    layoutVMenu1->addLayout(layoutHMenu1);
    layoutVMenu1->addWidget(lable1_1);
    helpFrame->setLayout(layoutVMenu1);
    layoutMainFrame->addWidget(helpFrame);
    //关于
    QFrame *aboutFrame = new QFrame();
    QHBoxLayout* layoutHMenu2 = new QHBoxLayout();
    layoutHMenu2->setContentsMargins(0,0,0,0);
    layoutHMenu2->setSpacing(0);
    //1/关于
    m_btnOpenAbout = new QToolButton();
    m_btnOpenAbout->setText(tr("关于"));
    m_btnOpenAbout->setMaximumWidth(60);
    layoutHMenu2->addWidget(m_btnOpenAbout);
    m_btnTranslate = new QToolButton();
    m_btnTranslate->setText(tr("翻译"));
    QObject::connect(m_btnTranslate,SIGNAL(clicked(bool)),this,SLOT(on_btnTranslate_clicked(bool)));
    m_btnTranslate->setMaximumWidth(60);
    layoutHMenu2->addWidget(m_btnTranslate);
    //关于小分类
    m_lable2_1 = new QLabel(this);
    m_lable2_1->setText(tr("关于"));
    m_lable2_1->setMaximumHeight(20);
    m_lable2_1->setAlignment(Qt::AlignCenter);
    QVBoxLayout* layoutVMenu2 = new QVBoxLayout();
    layoutVMenu2->setContentsMargins(0,0,0,0);
    layoutVMenu2->setSpacing(0);
    layoutVMenu2->addLayout(layoutHMenu2);
    layoutVMenu2->addWidget(m_lable2_1);
    aboutFrame->setLayout(layoutVMenu2);
    layoutMainFrame->addWidget(aboutFrame);
    //最后加弹簧
    QSpacerItem *spacer = new QSpacerItem(10, 20,
                               QSizePolicy::Expanding,
                               QSizePolicy::Minimum);
    layoutMainFrame->addItem(spacer);
}

这个界面是没有retranslateUi()这个函数的。
说说QT国际化的概念:
QT国际化(Internationalization,简称I18N)是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。
这使得软件能够在不同的国家和地区使用,并且可以根据用户的语言和地区提供本地化的使用体验。
QT是一种跨平台的应用程序开发框架,提供了很多工具和功能来支持国际化。

过程

先看看,ui的这个函数到底做了什么,我们可以模仿这一个函数实现相应的功能,充分利用QT框架的东西:
在这里插入图片描述

原来是重新设置了一下文本相关的东西。
这让我们可以知道,执行了这段代码后:

qApp->removeTranslator(trans);
    delete trans;
    trans=new QTranslator;
    trans->load("samp16_1_cn.qm");
    qApp->installTranslator(trans);

语言已经翻译完了,但需要把翻译的结果,再放到界面上去,如果放到界面上去,就是需要手动的设置这些控件的文本,感觉有些笨似的,然而,却只能这样;如果用Ui设置器的话,Qt界面设计器会为我们自动生成这些代码,但我们没有用Qt界面设计器,所以也没有这些函数,只有我们自己去实现这些函数。
先看实现的效果:
在这里插入图片描述
在这里插入图片描述
我们是这样实现的:
首先是“翻译”按钮的实现逻辑:

void Widget::on_btnTranslate_clicked(bool checked)
{
    static bool isChinese = true;
    if(isChinese)
    {
        qDebug()<<"isChinese="<<isChinese;
        if(trans)
        {
            qApp->removeTranslator(trans);
            delete trans;
        }
        QString appDirPath = QCoreApplication::applicationDirPath();
        //QString fileName = appDirPath+"//translate1_cn.qm";
        QString fileName = QString(":/translate/translate1_cn.qm");
        trans=new QTranslator;
        trans->load(fileName);
        qApp->installTranslator(trans);
        qApp->processEvents();
        //this->update();
        isChinese = false;
    }
    else
    {
        qDebug()<<"isChinese="<<isChinese;
        if(trans)
        {
            qApp->removeTranslator(trans);
            delete trans;
        }
        QString appDirPath = QCoreApplication::applicationDirPath();
        QString fileName = QString(":/translate/translate1_en.qm");
        //QString fileName = appDirPath+"//translate1_en.qm";
        trans=new QTranslator;
        trans->load(fileName);
        qApp->installTranslator(trans);
        qApp->processEvents();
        isChinese = true;
    }
    //ui->retranslateUi(this);
}

这个逻辑很简单,就是利用QT的函数实现了翻译工作,但是少了retranslateUi()函数的实现,如何实现这一个函数呢?
先定义一个事件:

void Widget::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::LanguageChange) {
           retranslateUi();  // 语言变化时更新界面
       }
    QWidget::changeEvent(event);
}

再实现retranslateUi()函数:

void Widget::retranslateUi()
{
     m_btnOpenAbout->setText(tr("关于"));
     m_btnOpenHelp->setText(tr("打开帮助"));
     m_lable2_1->setText(tr("关于"));
     m_btnTranslate->setText(tr("翻译"));
}

这样就实现了翻译工作。
效果如下:

Qt界面国际化1

总结

用QT开发多语言界面程序,主要包括以下几个步骤
1)在程序设计阶段,程序代码中每一个用户可见的字符串都有tr()函数封装
2)在项目配置文件(.pro文件)中设置需要导出的翻译文件(.ts文件),使用lupdate工具扫描项目文件 中需要翻译的字符串,并生成翻译文件
3)使用Qt的Linguist程序打开后成的翻译文件,将程序中的字符串翻译为需要的语言,如将所中文字符串翻译为英文
4)使用lrelease工具编译翻译好的翻译文件,生成更为紧凑的".qm"文件。
5)在应用程序中用QTranslator调用不两年的".qm"文件,实现不同的语言界面。
关于手写代码界面的翻译,有如下关键部分:
翻译事件:

[virtual protected] void QWidget::changeEvent(QEvent *event)
This event handler can be reimplemented to handle state changes.
The state being changed in this event can be retrieved through the event supplied.
Change events include: QEvent::ToolBarChange, QEvent::ActivationChange, QEvent::EnabledChange, QEvent::FontChange, 
QEvent::StyleChange, QEvent::PaletteChange, QEvent::WindowTitleChange, QEvent::IconTextChange, QEvent::ModifiedChange, 
QEvent::MouseTrackingChange, QEvent::ParentChange,
 QEvent::WindowStateChange, QEvent::LanguageChange, QEvent::LocaleChange, QEvent::LayoutDirectionChange, QEvent::ReadOnlyChange.

这个过程体现了QT事件的灵活应用:
在这里插入图片描述

相关文章:

  • 提高开发效率:公共字段自动化填充方案
  • 【优选算法篇】--深度解析之滑动窗口篇
  • appium之Toast元素识别
  • Matlab 雷达导引头伺服系统的建模与仿真研究
  • python-leetcode 55.子集
  • Flutter 按钮组件 ElevatedButton 详解
  • spring AOP学习
  • Matlab 汽车ABS实现模糊pid和pid控制
  • SQL语言的编译原理
  • SQLMesh宏操作符深度解析:掌握@star与@GENERATE_SURROGATE_KEY实战技巧
  • 重生之我在学Vue--第13天 Vue 3 单元测试实战指南
  • 【漫话机器学习系列】144.辛普森悖论(Simpson‘s Paradox)
  • 数学建模:MATLAB循环神经网络
  • 嵌入式八股RTOS与Linux---前言篇
  • YOLOv1到YOLOv12发展概述2025.3.17
  • 网络安全运维应急响应与溯源分析实战案例
  • MyBatis 如何创建 SqlSession 对象的?
  • Oracle静默安装方法
  • 再学:abi编码 地址类型与底层调用
  • 烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明
  • 宋徽宗《芙蓉锦鸡图》亮相,故宫首展历代动物绘画
  • 五大国有银行明确将撤销监事会
  • 买新房可申领学位,广州南沙出台购房入学政策
  • 船只深夜撞上海上风机后沉没1死1失踪,调查报告公布
  • 《奇袭白虎团》原型人物之一赵顺合辞世,享年95岁
  • 稳就业稳经济五方面若干举措将成熟一项出台一项