Qt中英文切换(涉及多种场景)

qt中英文切换涉及到一个软件两个文件,分别是QtLinguist、.ts文件和.qm文件。

1、在Pro中添加

TRANSLATIONS += en.ts \
               ch.ts

添加这个文件后qmake,然后如下操作点击更新:
Qt中英文切换(涉及多种场景)_第1张图片
这个时候会生成2两个文件en.ts和ch.ts。
Qt中英文切换(涉及多种场景)_第2张图片
2、将这两个文件添加到项目中方便修改。
Qt中英文切换(涉及多种场景)_第3张图片
3、这个时候我们可以在工程中进行准备工作了。
首先把代码中除.ui文件外的所有中文使用tr()括起来,使Qt Linguist能够识别到。
然后如下操作
Qt中英文切换(涉及多种场景)_第4张图片
使用QtLinguist方式打开。
Qt中英文切换(涉及多种场景)_第5张图片
找出所有需要翻译的中文,在下面输入栏中进行翻译。
翻译后点击以下操作进行确定。Qt中英文切换(涉及多种场景)_第6张图片
然后点击保存。
Qt中英文切换(涉及多种场景)_第7张图片
最后如下进行发布。
Qt中英文切换(涉及多种场景)_第8张图片
发布后会生成两个.qm文件。
将文件放在执行文件同级目录,方便后面进行加载。
Qt中英文切换(涉及多种场景)_第9张图片
4、加载qm文件实时切换中英文。

void Widget::on_pushButton_clicked()
{
    qDebug()<<m_translator->load(QApplication::applicationDirPath()+"/en.qm");
    qApp->installTranslator(m_translator);
    ui->retranslateUi(this);

}

void Widget::on_pushButton_2_clicked()
{
    qDebug()<<m_translator->load(QApplication::applicationDirPath()+"/ch.qm");
    qApp->installTranslator(m_translator);
    ui->retranslateUi(this);
}

这步完成后基本上只有主页在.ui文件中的控件可以实时中英文切换,但是还有很多切换没有成功。

4、这个时候有其它场景的中英文切换如下。
场景1:UI文件中的控件翻译,其它页面的.ui需要进入事件来进行配置。如下

void Form::changeEvent(QEvent *event)
{
    if(event->type() == QEvent::LanguageChange){
        this->ui->retranslateUi(this);
    }
}

场景2:主页和其它页非.ui文件中的控件(控件为成员对象时)

void Form::changeEvent(QEvent *event)
{
    if(event->type() == QEvent::LanguageChange){
        this->ui->retranslateUi(this);
        m_label->setText(tr("你好"));
        m_label2->setText(tr("测试2"));
    }
}

跟上面是不是很像,没错就是大部分一样,但是

this->ui->retranslateUi(this);

它只能修改.ui中的中英文,非.ui的需要自己来加载。

场景3:主页和其它页非.ui文件中的控件(控件为局部对象时)
这个就是控件在函数里面创建,翻译方法如下:

Form2::Form2(QWidget *parent) :
    QWidget(parent)
{
    QLabel* lab = new QLabel(tr("武汉加油"),this);
    lab->setGeometry(0,0,120,20);

    QPushButton* btn = new QPushButton(tr("武汉加油"),this);
    btn->setGeometry(0,30,120,20);
}

Form2::~Form2()
{
}

void Form2::changeEvent(QEvent *event)
{
    if(event->type() == QEvent::LanguageChange){
        QList<QLabel *> labs =this->findChildren<QLabel *>();
        foreach (QLabel *lab, labs)
        {
          lab->setText(tr("武汉加油"));
        }

        QList<QPushButton *> btns =this->findChildren<QPushButton *>();
        foreach (QPushButton *btn, btns)
        {
          btn->setText(tr("武汉加油"));
        }
    }
}

以上是介绍实时中英切换的,但是同时存在一个中文版本和一个英文版本是没有这么复杂的,直接加载.qm文件就行了,后面操作基本上都不需要了。

这里还介绍一个更简单的实时切换中英文的方法:
如下:
.cpp文件

void Widget::on_pushButton_clicked()
{
    qDebug()<<m_translator->load(QApplication::applicationDirPath()+"/en.qm");
    qApp->installTranslator(m_translator);
    ui->retranslateUi(this);
    qApp->exit();

}

void Widget::on_pushButton_2_clicked()
{
    qDebug()<<m_translator->load(QApplication::applicationDirPath()+"/ch.qm");
    qApp->installTranslator(m_translator);
    ui->retranslateUi(this);
    qApp->exit();
}

main.cpp文件:

    UMainWindow w;
    w.show();
    bool ok = a.exec();
    f(!ok)
    {
        QProcess::startDetached(qApp->applicationFilePath(), params);
        return ok;
    }

这种是通过自动重启来实现的中英文切换。

Qt中英文切换(涉及多种场景)_第10张图片
Qt中英文切换(涉及多种场景)_第11张图片
源码

你可能感兴趣的:(QT,qt,ui,开发语言)