Qt国际化翻译(中英切换)步骤:可子界面翻译

效果显示:

1、英文翻译:

在这里插入图片描述
2、中文翻译:
在这里插入图片描述

步骤

1、用一个函数用来设置控件的文本信息,因为每次切换语言,就要重新设置控件的文本信息,所以我这里用了一个FunSetText()函数封装(FunSetText()在代码部分有显示,这里只是演示如何用tr("")包裹文本),并且文本信息用tr(“”);如QPushButton p要设置文本

p->setText(tr("Info")); //用tr("")设置,这是重点,不这样设置到时候翻译的时候识别不出来

2、pro文件中添加 ,添加如下语句。这条语句是为了生成两个.ts文件。

TRANSLATIONS = English.ts Chinese.ts

3、点击Qt工程中的更新翻译,如下图所示,更新翻译之后,在你的当前路径下会有两个.ts文件,如果没有生成可以是pro文件中没有添加TRANSLATIONS = English.ts Chinese.ts或者是在其他路径:在这里插入图片描述
生成两个.ts文件:
在这里插入图片描述
4、打开QT语言家(如果你的电脑没有装语言家则没有),找到自己编译相对应的语言家版本,以管理员的方式打开,这样更稳定。
在这里插入图片描述
5、英–中翻译:如果你要翻译的文本没有用tr("")这样是无法识别的。下图是打开语言家后的界面。
5.1、选择你刚刚生成的.ts文件进行翻译。这里先选择Chinese.ts(也可以一次性同时选择两个ts文件打开,这样我们的翻译的速度就快很多)
在这里插入图片描述
5.2、按照步骤设置翻译的内容(这里提及一下,相同的翻译内容设置一次就可以了,当你保存之后再次载入他就能识别)
在这里插入图片描述
5.3、当你设置完所有的翻译之后,发布生成qm文件-点击文件下的发布,发布之后会在.ts文件的路径下生成.qm文件
在这里插入图片描述
6、英-英翻译;其实相同的语言翻译就把翻译内容和要翻译的问题内容一致即可。因为英-中的步骤我已经写了,英-英的和中-中的翻译一样的步骤就可以,这里就不多加演示了。
在这里插入图片描述
7、最后我们就生成了两个.qm文件了
在这里插入图片描述

代码:

1、声明一个QTranslator类的变量

QTranslator mTranslator;

2、FunSetText用来给控件设置文本信息,因为每次翻译都需要更新控件文本的内容,所有用一个函数封装起来更方便。

void MainWindow::FunSetText()
{
//注意:ui更新要在前面,不然内容会被清空,具体的可以去ui的.h文件中看看retranslateUi()
	//更新ui中控件的文本信息
    ui->retranslateUi(this); 
    //更新代码中的文本信息
    mpSystemMenu->setTitle(tr("System"));
    mpLanguage->setTitle(tr("Language"));
    mpSysEnableAction->setText(tr("System Enable"));
    mpSysCheckAction->setText(tr("System Check"));
    mpSysExitAction->setText(tr("Exit"));
    mpLanguageEnglish->setText(tr("English"));
    mpLanguageChinese->setText(tr("Chinese"));
    ui->pushButton->setText(tr("ChangeWidget"));
}

3、语言改变事件

protected:
    void changeEvent(QEvent *event);
void MainWindow::changeEvent(QEvent *event)
{
	switch (event->type())
	{
		case QEvent::LanguageChange:
			FunSetText(); 
			break;
		default:
			QWidget::changeEvent(event);
	}
}

4、点击了中英文翻译

    //点击切换成英文
    connect(mpLanguageEnglish, &QAction::triggered,this,[=]()
    {
        mTranslator.load(":/English.qm");
        //下面这条语句会触发语言改变事件,调用FunSetText()函数
        qApp->installTranslator(&mTranslator); //再加载完翻译文件之后更新文本信息
    });
      //点击切换成中文
    connect(mpLanguageChinese, &QAction::triggered,this,[=]()
    {
        mTranslator.load(":/Chinese.qm");
        qApp->installTranslator(&mTranslator);
    });

到此就ok了

注意事项:

1、每次新增或者删除了要翻译的内容,要翻译的时候记得过更新翻译;
2、翻译的本质是重新设置文本,所以向QMessageBox这个点击的时候生成的控件可以不需要提供更新接口,直接加tr()设置即可。

QMessageBox::warning(this,tr("Warning"),tr("Do you want Exit?"),tr("OK"),tr("Cancel"));

3、调用ui->retranslateUi(this)之后再调用FunSetText()重新设置文本,因为ui->retranslateUi(this)用给ui上拉的控件重新设置文本信息,可能会清空文本。
4、加载完翻译文本之后再调用FunSetText()重新设置文本。等翻译文件加载完之后再重新设置才能生效。
5、QT翻译失效问题
6、翻译的本质是,加载完翻译文本之后,当遇到这个用tr()包裹的内容,会和qm中的内容进行一个查找,如果查找到了这个内容,就按照设置的翻译内容翻译,如果没有就不翻译。

程序网盘

为了方便大家使用,我共享在网盘上了,有想要的可以去拿。
第一次完成这么长的一篇文章,喜欢的小伙伴给个支持吧。
提取码:wzds
网盘链接

  • 12
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Qt Creator中,可以使用QStackedWidget控件来实现主界面和子界面切换。具体步骤如下: 1. 在主界面上添加一个QStackedWidget控件,并设置其布局。 2. 在QStackedWidget控件中添加各个子界面。 3. 在主界面上添加按钮等控件,通过信号槽机制来控制QStackedWidget控件中各个子界面切换。 代码示例: 主界面的代码: ``` MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 创建QStackedWidget控件 stackedWidget = new QStackedWidget(this); setCentralWidget(stackedWidget); // 添加子界面 QWidget *page1 = new QWidget(); QLabel *label1 = new QLabel("主界面"); QVBoxLayout *layout1 = new QVBoxLayout(); layout1->addWidget(label1); page1->setLayout(layout1); QWidget *page2 = new QWidget(); QLabel *label2 = new QLabel("子界面"); QVBoxLayout *layout2 = new QVBoxLayout(); layout2->addWidget(label2); page2->setLayout(layout2); stackedWidget->addWidget(page1); stackedWidget->addWidget(page2); // 添加按钮 QPushButton *button1 = new QPushButton("切换到子界面", this); connect(button1, &QPushButton::clicked, this, &MainWindow::changePage); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->addWidget(button1); setLayout(mainLayout); } void MainWindow::changePage() { stackedWidget->setCurrentIndex(1); } ``` 子界面的代码: ``` ChildWidget::ChildWidget(QWidget *parent) : QWidget(parent) { QLabel *label = new QLabel("子界面"); QVBoxLayout *layout = new QVBoxLayout(); layout->addWidget(label); setLayout(layout); } ``` 在子界面中添加返回按钮,通过信号槽机制来实现返回到主界面: ``` QPushButton *button = new QPushButton("返回", this); connect(button, &QPushButton::clicked, parent(), &MainWindow::changePage); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值