文章目录

  • 一、翻译程序示例图
  • 二、流程须知(个人理解)
  • 三、关于对话框中QDialogButtonBox翻译的操作
  • 四、源码
    • CLinguistTest.h
    • CLinguistTest.cpp
    • CLinguistTest.ui
    • CTipDialog.h
    • CTipDialog.cpp
    • CTipDialog.ui
  • 总结
  • 相关文章

一、翻译程序示例图

下图包含两个窗口,先弹出一个对话框,然后点击按钮切换语言。

二、流程须知(个人理解)

  1. 想要使用翻译类生成文件,需要在pro文件中指定生成目录,如本文pro文件中的TRANSLATIONS = Language/linguist_cn.ts Language/linguist_en.ts,其中Language/为ts、qm文件包含目录,该文件夹存在于pro文件同级目录中(不设置包含目录则两种类型文件生成在pro同级目录中)。
  2. 代码中包含文本时需添加使用tr函数包含文本,使其在生成ts文件时能识别到;提示:tr函数使用方法建议单独查看
  3. 当编辑完成后后,通过下图方式生成ts文件(存在则覆盖);
  4. 使用Qt Linguist打开ts文件,如下图方式编辑翻译,然后保存;
  5. 然后如下图方式生成qm文件操作(存在则覆盖);
    (生成当前ts文件的qm文件)


    (生成当前项目中所有ts文件的qm文件)
    最后如代码中使用即可。

三、关于对话框中QDialogButtonBox翻译的操作

在ts文件中需要手动添加如下代码,这就是为什么我Qt Linguist打开ts文件会多一项“QPlatformTheme”的原因,具体原因请查看Qt QDialogButtonBox 英文翻译问题;

 <context><name>QPlatformTheme</name><message><location filename="../CTipDialog.ui"/><source>OK</source><translation>确定</translation></message><message><source>Cancel</source><translation>取消</translation></message>
</context>

四、源码

CLinguistTest.h

#ifndef CLINGUISTTEST_H
#define CLINGUISTTEST_H#include "CTipDialog.h"
#include <QMainWindow>
#include <QTranslator>namespace Ui {class CLinguistTest;
}class CLinguistTest : public QMainWindow
{Q_OBJECTpublic:explicit CLinguistTest(QWidget *parent = nullptr);~CLinguistTest();private slots:// 语言切换槽函数void on_switchLanguageBtn_clicked();private:Ui::CLinguistTest   *ui;bool                m_languageFlag; // 语言标记值(true为中文,false为英语)CTipDialog          *m_dialog;  // 对话框指针QTranslator         *m_translator;  // 翻译类对象指针
};#endif // CLINGUISTTEST_H

CLinguistTest.cpp

#include "CLinguistTest.h"
#include "ui_CLinguistTest.h"
#include "CTipDialog.h"
#include <QApplication>
#include <QPushButton>CLinguistTest::CLinguistTest(QWidget *parent): QMainWindow(parent), ui(new Ui::CLinguistTest), m_languageFlag(true), m_translator(nullptr)
{ui->setupUi(this);// 创建对话框对象m_dialog = new CTipDialog;// 连接信号槽,弹出对话框connect(ui->showDialogBtn, SIGNAL(clicked()), m_dialog, SLOT(show()));// 发出信号,作用为初始化语言emit ui->switchLanguageBtn->clicked();
}CLinguistTest::~CLinguistTest()
{delete m_dialog;        // 释放对话框的内存空间delete m_translator;    //释放翻译类对象的内存空间delete ui;              // 释放ui的内存空 间
}void CLinguistTest::on_switchLanguageBtn_clicked()
{// 当翻译类对象不为空才进入if(nullptr != m_translator){// 移除上次设置的翻译类对象qApp->removeTranslator(m_translator);// 释放翻译类对象空间delete  m_translator;}//! 创建时使用默认语言(中文)// 获取可执行程序地址,上跳两级目录,再拿到应用程序名,组成项目pro文件所在目录QString filePath = qApp->applicationDirPath() + "/../../" +qApp->applicationName();// 判断标记值组qm文件地址if(m_languageFlag){filePath += "/Language/linguist_cn.qm";}else{filePath += "/Language/linguist_en.qm";}// 每次进入将标记值取反m_languageFlag = !m_languageFlag;// 创建翻译对象m_translator = new QTranslator;// 加载翻译文件m_translator->load(filePath);// 安装翻译文件qApp->installTranslator(m_translator);// 更新翻译ui->retranslateUi(this);m_dialog->retranslateUi();
}

CLinguistTest.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>CLinguistTest</class><widget class="QMainWindow" name="CLinguistTest"><property name="geometry"><rect><x>0</x><y>0</y><width>290</width><height>280</height></rect></property><property name="windowTitle"><string>Qt语言家测试</string></property><widget class="QWidget" name="centralWidget"><layout class="QVBoxLayout" name="verticalLayout"><item><widget class="QLabel" name="label"><property name="text"><string>一个标签</string></property></widget></item><item><widget class="QCheckBox" name="checkBox"><property name="text"><string>一个复选框</string></property></widget></item><item><layout class="QHBoxLayout" name="horizontalLayout"><item><widget class="QPushButton" name="switchLanguageBtn"><property name="text"><string>中文</string></property></widget></item><item><widget class="QPushButton" name="showDialogBtn"><property name="text"><string>弹出一个对话框</string></property></widget></item></layout></item><item><widget class="QTextEdit" name="textEdit"><property name="placeholderText"><string>我是文本框</string></property></widget></item></layout></widget><widget class="QMenuBar" name="menuBar"><property name="geometry"><rect><x>0</x><y>0</y><width>290</width><height>23</height></rect></property><widget class="QMenu" name="menumenu"><property name="title"><string>菜单</string></property><addaction name="action_1"/><addaction name="action_2"/></widget><addaction name="menumenu"/></widget><widget class="QToolBar" name="mainToolBar"><attribute name="toolBarArea"><enum>TopToolBarArea</enum></attribute><attribute name="toolBarBreak"><bool>false</bool></attribute></widget><widget class="QStatusBar" name="statusBar"/><action name="action_1"><property name="text"><string>选项1</string></property></action><action name="action_2"><property name="text"><string>选项2</string></property></action></widget><layoutdefault spacing="6" margin="11"/><resources/><connections/>
</ui>

CTipDialog.h

#ifndef CTIPDIALOG_H
#define CTIPDIALOG_H#include <QDialog>namespace Ui {class CTipDialog;
}class CTipDialog : public QDialog
{Q_OBJECTpublic:explicit CTipDialog(QWidget *parent = nullptr);~CTipDialog();/*** @brief retranslateUi 调用函数更新翻译*/void retranslateUi();private:Ui::CTipDialog *ui;
};#endif // CTIPDIALOG_H

CTipDialog.cpp

#include "CTipDialog.h"
#include "ui_CTipDialog.h"
#include <QAbstractButton>CTipDialog::CTipDialog(QWidget *parent) :QDialog(parent),ui(new Ui::CTipDialog)
{ui->setupUi(this);
}CTipDialog::~CTipDialog()
{delete ui;
}void CTipDialog::retranslateUi()
{// 更新ui->retranslateUi(this);
}

CTipDialog.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>CTipDialog</class><widget class="QDialog" name="CTipDialog"><property name="geometry"><rect><x>0</x><y>0</y><width>346</width><height>187</height></rect></property><property name="windowTitle"><string>提示对话框</string></property><layout class="QVBoxLayout" name="verticalLayout"><item><widget class="QLabel" name="label"><property name="text"><string>一个对话框</string></property></widget></item><item><widget class="QDialogButtonBox" name="buttonBox"><property name="orientation"><enum>Qt::Horizontal</enum></property><property name="standardButtons"><set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set></property></widget></item></layout></widget><resources/><connections><connection><sender>buttonBox</sender><signal>accepted()</signal><receiver>CTipDialog</receiver><slot>accept()</slot><hints><hint type="sourcelabel"><x>248</x><y>254</y></hint><hint type="destinationlabel"><x>157</x><y>274</y></hint></hints></connection><connection><sender>buttonBox</sender><signal>rejected()</signal><receiver>CTipDialog</receiver><slot>reject()</slot><hints><hint type="sourcelabel"><x>316</x><y>260</y></hint><hint type="destinationlabel"><x>286</x><y>274</y></hint></hints></connection></connections>
</ui>

总结

本文翻译内容都是存在于UI文件中的,UI文件中的文本会自动识别到ts文件中(建议在UI文件中设置窗口标题);要是想代码中操作文本那就需要做其他操作,这就是为什么Qt语言家我打算写多个文章的原因,然后tr函数我个人也需要再搞清楚一点,内容将在(二)中展出。

相关文章

Qt之语言家的简单使用(二)(使用注意事项,含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

Qt之语言家的简单使用(一)(Qt翻译UI,Qt Linguist的使用,含源码+注释)相关推荐

  1. Qt之超简单的TCP通信(自定义TCP通信类,含源码+注释)

    文章目录 一.TCP通信示例图 二.TCP使用前的准备 三.自定义TCP通信类的两种方法 四.源码(含注释) TCP Server CTcpServer.h CTcpServer.cpp TCP Cl ...

  2. Qt数据库练习之QSqlTableModel的使用(MySql数据库示例,含源码+注释)

    文章目录 一.操作示例 1.1 修改记录(数据) 1.2 添加记录(数据) 1.3 删除记录(数据) 1.4 取消操作 1.5 排序操作 1.6 查询操作 二.了解QSqlTableModel 三.源 ...

  3. Qt之天气预报——界面优化篇(含源码+注释)

    一.界面优化效果 下方为界面优化完成和优化前的效果对比. 优化前: 优化后: 二.优化内容 添加标题栏 添加图片(图图标素材源自阿里巴巴矢量图标库) 更新UI内容(微调大小.布局比例) 添加鼠标事件函 ...

  4. Qt小游戏之数字华容道(百行代码搭雏形,可玩;含源码+注释)

    文章目录 一.数字华容道,样图如下 二.废话少说直接上代码 1.首先是代码文件分析 2.CLabel的源码 3.CMainWindow的源码 4.main文件 总结 一.数字华容道,样图如下 相信大家 ...

  5. 【Qt 开源音视频框架模块QtAV】03:QTAV主要接口展示以及播放器源码分享

    介绍 QtAV 是一个基于 Qt 和 FFmpeg 的跨平台.高性能多媒体播放框架,能够帮助你轻而易举地编写出一个播放器. [Qt 开源音视频框架模块QtAV]01:介绍.编译以及简单使用 因为网上使 ...

  6. 区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-熊丽兵-专题视频课程...

    区块链技术进阶-深入详解以太坊智能合约语言 solidity(含源码)-103人已学习 课程介绍         区块链开发技术进阶-深入详解以太坊智能合约语言 solidity视频培训教程:本课程是 ...

  7. 简单音乐播放器html+css+基础vue+含源码,有搜索和播放mv功能,代码可直接复制用。

    题目:html+css+基础vue实现的简单音乐播放器(含源码),有搜索和播放mv功能,代码可直接复制用. 问题描述: 如果vue刚入门,掌握一些基础语法后就可以写一个简单的音乐播放器来练练手~~如果 ...

  8. 老男孩GO语言线下培训班1期整套教程(完整18天含源码)

    老男孩GO语言线下培训班1期整套教程(完整18天含源码) 老男孩教育-Go语言第一期(共18天 含课程源码) 课程详细目录: ├─L001-Go语言-mp4 │      01 Go开发1期 day1 ...

  9. 使用Qt作窗口截屏(含源码)

    截屏(screenshot),就是将屏幕上的东西拷贝下来存成图片文件.介绍的好像有点多余:(,那我们就直接切入正题. QPixmap提供了两个函数grabWidget和grabWindow可以将屏幕上 ...

最新文章

  1. PICRUSt:16S预测宏基因组-扩增子分析锦上添花
  2. 牛博威:成熟的反外挂系统一般企业未必能承受
  3. WSAENOBUFS: No buffer space available in SAP
  4. java控制台计算数字_java从控制台接收一个数字
  5. 女人必知 教你认清6种隐性坏男人
  6. ciaodvd数据集的简单介绍_人工智能进阶-CIFAR-10数据集介绍
  7. jquery--动态篇
  8. python-简单邮件报警
  9. centos7.x配置mysql初始密码
  10. Redis远程连接不上解决办法
  11. Android-进阶教程-权限-特殊权限-AppOps
  12. 移动硬盘显示设备未就绪的文件寻回方法
  13. 国际博物馆日 | 去全球摄影之家——纽约摄影展览馆领略艺术的魅力
  14. Android Studio自带模拟器打不开,一直停留在带有Android的页面
  15. 基于Python的心率分析
  16. excel表格怎么调整行高和列宽_如何在微信推文中插入表格内容?
  17. 架构11 社交软件红包技术03
  18. Java微服务前后端分离技术开发的微信快速框架-教程
  19. 注意ID不能使用除 ASCII 字母、数字、_、- 和 . 以外的字符
  20. 单片机的“内芯”世界

热门文章

  1. 日迹2022.3.22
  2. 解决弹出的窗口window.open会被chrome浏览器阻止的问题
  3. java百度转高德,百度、高德、Googe经纬度转换
  4. 一加3t android 7.1,一加3T要来了!除了骁龙821还直接上安卓7.1?
  5. MySQL常用命令小笔记
  6. 任意网站商品上货监控提醒(提醒尺码颜色sku)
  7. Chrome浏览器对应chromedriver版本 最新2019
  8. 弘辽科技:拼多多三级处罚了还能开第二个店铺吗?
  9. 加密狗原理介绍(转)
  10. 【MySQL】Got an error reading communication packets