Qt多语言动态切换

有个软件,里面做了13种语言,销售要求实现重新设置软件语言后,不需要重启软件,就可以看到软件显示出对应的语言。
 
软件中所有需要翻译的地方都是用的 tr(QString) 来做的,并且软件是多个窗口(QDialog),需要在设置窗口中设置语言,然后其他窗口的语言也发生变化。
 
最开始的做法是:
1.重新加载语言 qApp->installTranslator(QTranslator &messageFile);
2.重写 changeEvent 事件
3.在 changeEvent 事件中接收到 软件语言发生变化后,就刷新窗口 ui.retranslateUi(this);
 
流程是这个流程,方法是这个方法,但是就是不生效,无法动态切换,然后就是各种百度,基本都是前篇一律,一个抄一个,没啥用。
然后耗费了大量的时间后,看到了一个有用的:https://bbs.csdn.net/topics/392090653
从回复中,可以学习到Qt翻译的过程是: installlTranslater() -> changeEvent(QEvent::LanguageEvent) -> retranslate()/retranslateUI()。
大佬也有告诉我们在 changeEvent 之前,我们需要重新设置一遍 setText(tr())
 
 
然后经过不懈的努力,终于实现了,代码可以参考下面的:
*: 写一个函数,把所有的 setText(tr()) 都放在这个函数中处理。每次切换完语言,重新 setText(tr()),然后在刷新界面。
*: 如果其他窗口中的多语言没有生效,请注意内存分区。可以将变量:QTranslator trans 放在全局区,如下面的代码第二行。
 
#include "QtWidgetsApplication1.h"
QTranslator trans;


QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent)
    : QDialog(parent)
{
    ui.setupUi(this);

    mySetUiText();
    connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(change1()));
    connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(change2()));

    
}

QtWidgetsApplication1::~QtWidgetsApplication1()
{}

void QtWidgetsApplication1::changeEvent(QEvent * e)
{
    if (e->type() == QEvent::LanguageChange)
    {
        ui.retranslateUi(this);
    }
    else 
    {
        QWidget::changeEvent(e);
    }
}

void QtWidgetsApplication1::change1()
{
    trans.load(":/Translation_zh_CN.qm");
    qApp->installTranslator(&trans);
    mySetUiText();
}

void QtWidgetsApplication1::change2()
{
    trans.load(":/Translation_en.qm");
    qApp->installTranslator(&trans);
    mySetUiText();
}

void QtWidgetsApplication1::mySetUiText()
{
    ui.label->setText(tr("text"));
    ui.pushButton->setText(tr("zhongwen"));
    ui.pushButton_2->setText(tr("yingwen"));

    ui.pushButton->setToolTip(tr("zhongwen"));
    ui.pushButton_2->setToolTip(tr("yingwen"));
}

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2022-11-04 16:39  十一的杂文录  阅读(1334)  评论(0编辑  收藏  举报