> 文章列表 > Qt中英文切换(涉及多种场景)

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

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

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

1、在Pro中添加

TRANSLATIONS += en.ts \\ch.ts

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

MSDN工具