QT-多语言系统功能开发保姆级教程
目录【相关链接】Qt 实现中英文语言切换的示例1、架构流程和代码示例①. 项目结构②. 项目文件.pro③. 窗口头文件mainwindow.h④. 窗口实现文件mainwindow.cpp⑤. 主函数main.cpp⑥. 生成翻译文件.ts 和 .qm2、相关概念和常用操作①tr()和Qt_TR_NOOP宏1. tr() 函数2. QT_TR_NOOP() 宏②重写changeEvent函数和触发UI刷新retranslateUi函数③qApp-translate的使用QT提取和生成多语言库方式1使用QT的qtcreator图形界面提取和生成语言库方式2使用指令提取和生成语言库Qt 的富文本Rich Text和HTML 标签1. 文本样式2. 字体与颜色3. 段落与布局4. 标题与列表5. 链接与图片6. 表格7. 常用 CSS 样式部分支持8. 应用示例总结【相关链接】QT的QSettings 和 JSON 管理配置文件Qt 实现中英文语言切换的示例示例说明本示例举例实现中英文切换使用tr()或QT_TR_NOOP对翻译文本进行标记使用QT语言家进行多语言翻译生成.ts文件然后生成.qm语言库同时使用QSetting机制对当前切换语言进行保存起掉电保存效果当重启后会先加载QSetting记录的语言进行加载语言。1、架构流程和代码示例①. 项目结构LanguageSwitchDemo/ ├── LanguageSwitchDemo.pro ├── resources.qrc 可选 ├── main.cpp ├── mainwindow.h ├── mainwindow.cpp ├── translations/ │ ├── en.ts │ ├── zh.ts │ └── generate_qm.sh (可选)②. 项目文件.proQT core widgets SOURCES main.cpp mainwindow.cpp HEADERS mainwindow.h # 翻译文件路径 TRANSLATIONS translations/en_US.ts\ translations/zh_CN.ts # 指定生成 qm 文件的目标目录生成的 qm 文件会放在 debug/release 目录下 #CONFIG lrelease #CONFIG embed_translations RESOURCES resources.qrc③. 窗口头文件mainwindow.h#ifndef MAINWINDOW_H #define MAINWINDOW_H #include QWidget #include QTranslator #include QTimer #include QSettings class QLabel; class QPushButton; class QLineEdit; class QVBoxLayout; class MainWindow : public QWidget { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); protected: void changeEvent(QEvent *event) override; // 监听语言切换事件 private slots: void onLanguageSwitchClicked(); // 切换语言按钮响应 void updateDynamicText(); // 更新动态内容当前时间 private: typedef enum { LANGUAGE_TYPE_ZH_CN 0x00, // 简体中文 LANGUAGE_TYPE_EN_US 0x01, // 英语 } E_LanguageType; void initUI(); // 初始化界面 void retranslateUi(); // 手动刷新所有控件的文本 void ActLang_ZH_CN_Triggered(void); // 切换中文 void ActLang_EN_US_Triggered(void); // 切换英文 QString ReadTranslatorSetting(void); // 获取语言配置 void LoadPreviouTranslator(void); // 加载最近切换的语言 void LanguageSwitch(E_LanguageType language); private: // MyCompany, MyApp 参数配置路径: /root/.config/demo-ui/demo-app.conf #define DEMO_UI_COMPANY demo-ui #define DEMO_UI_APP demo-app QTranslator m_translator; // 当前使用的翻译器 bool m_isChinese; // 当前是否为中文 // UI 控件 QLabel *m_labelFixed; // 固定文本示例 QLabel *m_labelDynamicDesc; // 动态文本描述需要翻译 QLabel *m_labelTime; // 时间显示内容不需翻译 QLineEdit *m_lineEdit; // 输入框用户动态输入不翻译 QPushButton *m_switchBtn; // 切换语言按钮 QTimer *m_timer; // 定时更新时间 }; #endif // MAINWINDOW_H④. 窗口实现文件mainwindow.cpp#include mainwindow.h #include QLabel #include QPushButton #include QLineEdit #include QVBoxLayout #include QHBoxLayout #include QApplication #include QDebug #include QDateTime #include QCoreApplication MainWindow::MainWindow(QWidget *parent) : QWidget(parent) , m_isChinese(false) { initUI(); retranslateUi(); // 初始文本默认英文 updateDynamicText(); // 初始动态时间 // 每秒更新时间 m_timer new QTimer(this); connect(m_timer, QTimer::timeout, this, MainWindow::updateDynamicText); m_timer-start(1000); // 加载上次配置的语言也可以放到main函数中去 LoadPreviouTranslator(); } MainWindow::~MainWindow() { } void MainWindow::initUI() { // 创建控件 m_labelFixed new QLabel(this); m_labelDynamicDesc new QLabel(this); m_labelTime new QLabel(this); m_lineEdit new QLineEdit(this); m_switchBtn new QPushButton(this); // 设置输入框占位文本在 retranslateUi 中也会翻译 m_lineEdit-setPlaceholderText(tr(Please enter something...)); // 布局 QVBoxLayout *mainLayout new QVBoxLayout(this); mainLayout-addWidget(m_labelFixed); mainLayout-addWidget(m_labelDynamicDesc); mainLayout-addWidget(m_labelTime); mainLayout-addWidget(m_lineEdit); mainLayout-addWidget(m_switchBtn); setLayout(mainLayout); setWindowTitle(tr(Language Switch)); // Language Switch Demo // 连接按钮信号 connect(m_switchBtn, QPushButton::clicked, this, MainWindow::onLanguageSwitchClicked); } void MainWindow::retranslateUi() { // 所有需要随语言变化的文本都从这里设置 m_labelFixed-setText(tr(This is a static text.)); m_labelDynamicDesc-setText(tr(Current time:)); m_switchBtn-setText(tr(Switch to Chinese)); setWindowTitle(tr(Language Switch)); m_lineEdit-setPlaceholderText(tr(Please enter something...)); } void MainWindow::changeEvent(QEvent *event) { if (event-type() QEvent::LanguageChange) { // 当 QTranslator 变化时Qt 会自动发送 LanguageChange 事件 retranslateUi(); } QWidget::changeEvent(event); } void MainWindow::ActLang_ZH_CN_Triggered(void) { // 卸载当前翻译 qApp-removeTranslator(m_translator); // 加载新翻译文件 if (m_translator.load(:/translations/zh_CN.qm)) { qApp-installTranslator(m_translator); } else { return; } // ui-retranslateUi(this); QSettings settings(DEMO_UI_COMPANY, DEMO_UI_APP); settings.setValue(Setting/SystemSetting/Language, zh_CN); } void MainWindow::ActLang_EN_US_Triggered(void) { // 卸载当前翻译 qApp-removeTranslator(m_translator); // 加载新翻译文件 if (m_translator.load(:/translations/en_US.qm)) { qApp-installTranslator(m_translator); } else { return; } // ui-retranslateUi(this); QSettings settings(DEMO_UI_COMPANY, DEMO_UI_APP); settings.setValue(Setting/SystemSetting/Language, en_US); } //用于从注册表里读取上次设置的界面语言版本 QString MainWindow::ReadTranslatorSetting(void) { QString organization DEMO_UI_COMPANY; QString appName DEMO_UI_APP; QSettings settings(organization, appName); QString language settings.value(Setting/SystemSetting/Language, zh_CN).toString(); return language; } void MainWindow::LoadPreviouTranslator(void) { QString curLang ReadTranslatorSetting(); if(curLang en_US) { ActLang_EN_US_Triggered(); m_isChinese false; } else { ActLang_ZH_CN_Triggered(); m_isChinese true; } } void MainWindow::LanguageSwitch(E_LanguageType language) { switch (language) { case LANGUAGE_TYPE_ZH_CN: ActLang_ZH_CN_Triggered(); break; case LANGUAGE_TYPE_EN_US: ActLang_EN_US_Triggered(); break; default: break; } } void MainWindow::onLanguageSwitchClicked() { m_isChinese !m_isChinese; E_LanguageType Language LANGUAGE_TYPE_ZH_CN; if (!m_isChinese) { Language LANGUAGE_TYPE_EN_US; } LanguageSwitch(Language); // 注意安装翻译器后所有使用 tr() 的地方会自动收到 LanguageChange 事件 // 从而重新调用 retranslateUi()我们只需手动更新动态非 tr() 内容即可 updateDynamicText(); // 更新时间描述因为描述也是 tr()但时间数字不需翻译只需保持显示 } void MainWindow::updateDynamicText() { // 动态内容当前时间不需要翻译直接显示 QString currentTime QDateTime::currentDateTime().toString(yyyy-MM-dd hh:mm:ss); m_labelTime-setText(currentTime); // 注意动态文本的描述部分m_labelDynamicDesc已在 retranslateUi 中通过 tr() 更新 // 这里只负责刷新时间值本身 }⑤. 主函数main.cpp#include mainwindow.h #include QApplication #include QTranslator int main(int argc, char *argv[]) { QApplication app(argc, argv); // 加载默认英文翻译可选这里先不加载让界面显示源码中的英文 // 若需要默认中文可以加载 zh.qm MainWindow w; w.show(); return app.exec(); }⑥. 生成翻译文件.ts 和 .qm见后续章节QT提取和生成多语言库生成en_US.qm和zh_CN.qm。加载库文件有两种方式情况A你想使用资源系统推荐将 .qm 文件加入资源文件可选使用资源系统打包进二进制可执行文件【推荐】创建resources.qrcRCC qresource prefix/ filetranslations/en_US.qm/file filetranslations/zh_CN.qm/file /qresource /RCC并在.pro中添加RESOURCES resources.qrc然后在代码中使用:/translations/xxx.qm加载。m_translator.load(:/translations/zh_CN.qm); // 相对路径这样资源文件会被编译进二进制。情况B使用外部文件不打包进exe将zh.qm和en.qm放到与可执行文件同一目录的translations子文件夹下代码改为m_translator.load(translations/zh_CN.qm); // 相对路径if (m_translator.load(translations/zh.qm)) { qApp-installTranslator(m_translator); } else { qDebug() Failed to load Chinese translation from translations/zh.qm; }情况A和情况B可在加载文件前对文件进行检查QString path :/translations/zh_CN.qm; // 或 translations/zh_CN.qm if (QFile::exists(path)) { qDebug() File exists: path; } else { qDebug() File NOT found: path; }2、相关概念和常用操作①tr()和Qt_TR_NOOP宏在 Qt 的国际化i18n框架中tr()和QT_TR_NOOP或Q_TR_NOOP都是用于处理可翻译字符串的工具但用途和行为不同。注意只有需要翻译时才需要使用tr()或QT_TR_NOOP否则不要使用因为tr()和QT_TR_NOOP需要消耗资源。1.tr()函数tr()是QObject及其子类提供的一个静态成员函数实际是静态的tr()也常被实例方法调用。它的作用是在运行时将字符串从源代码中的原始语言翻译为目标语言。基本用法#include QObject class MyWidget : public QWidget { Q_OBJECT public: void setLabel() { // Hello 会被 lupdate 工具提取到 .ts 翻译文件中 // 在运行时根据当前 locale 返回翻译后的文本 ui-label-setText(tr(Hello)); } };工作原理静态提取lupdate扫描源代码将tr(...)中的字符串提取到.ts文件XML 格式。翻译使用 Qt Linguist 工具为每种语言填写翻译。运行时加载QTranslator加载对应语言的.qm二进制文件tr()根据当前 locale 查找并返回翻译后的字符串。上下文tr()默认以类名作为翻译上下文如MyWidget避免不同类中相同原文的翻译冲突。重要特点动态翻译如果应用程序在运行时改变了 locale例如用户切换语言需要重新调用tr()才能获得新翻译。支持占位符tr(Copy %1 to %2).arg(src).arg(dest)。只能用于QObject子类或使用QCoreApplication::translate()替代。2.QT_TR_NOOP()宏QT_TR_NOOP历史上也有QT_TRANSLATE_NOOP是一个空操作宏它的作用是标记字符串为“需要翻译”但不立即调用翻译函数。常用于需要在静态存储或非QObject子类中保持可翻译字符串的场景。基本用法依赖 QObject只有继承自 QObject 的类才能直接使用 tr()。如果在非 QObject 类或全局函数中使用需使用 QCoreApplication::translate() 或 QObject::tr()// 全局数组需要被翻译 static const char* const errorMessages[] { QT_TR_NOOP(No error), QT_TR_NOOP(Disk full), QT_TR_NOOP(Permission denied) }; void showError(int code) { // 真正翻译时使用 qApp-translate() 或 tr() // 注意这里 tr() 必须在某个 QObject 子类中被调用以获取正确的上下文 QString msg tr(errorMessages[code]); // 或者 QCoreApplication::translate(MyContext, errorMessages[code]) }为什么需要QT_TR_NOOP如果不加QT_TR_NOOPlupdate无法提取全局或静态字符串因为它们没有出现在tr()调用中。但若直接写tr(No error)在全局作用域tr()需要QObject实例无法编译。所以先用宏“标记”该字符串让lupdate提取它然后在真正需要翻译的地方如函数内再用tr()或translate()进行运行时翻译。变体宏QT_TR_NOOP(context, text)允许显式指定翻译上下文。QT_TRANSLATE_NOOP(context, text)与QT_TR_NOOP类似但要求上下文和文本两个参数已弃用推荐用QT_TR_NOOP配合tr()的上下文。②重写changeEvent函数和触发UI刷新retranslateUi函数QT中UI的文本如果没有变化就不会触发UI刷新setText可触发文本刷新导致当切换语言时也不会去刷新UI文本达不到语言切换的效果因此就需要我们重写changeEvent函数和触发UI刷新retranslateUi函数当m_translator.load qApp-installTranslator 切换语言时就会触发changeEvent槽函数如果有多个类且此类中需要翻译则有需要翻译文本的类都要重写changeEvent函数和实现retranslateUi函数。注如果使用的是qtcreator的UI界面拖拽图标生成的代码则不需要重写changeEvent函数和实现retranslateUi函数直接在切换语言触发的槽函数中添加ui-retranslateUi(this); 即可在触发语言切换时自动触发UI刷新。ui-retranslateUi(this);// 头文件.h中 // 翻译头文件 #include QTranslator class xxxClass: public QWidget { Q_OBJECT public: explicit xxxClass(QWidget *parent nullptr, const char *context nullptr); // context是可选项 记录是哪个new此xxxClass用于后续qApp-translate翻译context不是必须项只有当传输动态变化的内容时才需要此项如果xxxClass中需要翻译的项都是固定文本则无需此项 构造函数写成explicit xxxClass(QWidget *parent nullptr)即可 void SetText(const QString alarmText); ... // 1. 重定义 changeEvent 函数 protected: void changeEvent(QEvent *event) override; // 2. 自定义UI刷新函数RetranslateUi private: void RetranslateUi(); ... private: const char *m_context nullptr; // 记录 xxxClass 的上文context QString m_sourceAlarmStr; // 记录原文本用于RetranslateUi中翻译 }// 具体实现.cpp中 xxxClass::xxxClass(QWidget *parent, const char *context) : QWidget(parent), m_context(context) { ... } void xxxClass::SetText(const QString alarmText) { m_sourceAlarmStr alarmText; // 记录文本用于RetranslateUi中去翻译 ... } // 刷新需要文本变化的UI void xxxClass::RetranslateUi(void) { // 实现刷新需要刷新的UI // 如 m_context即记录上下文指明需要翻译的是哪个上文的内容适用于有过个上文class调用的场景 QString newText qApp-translate(m_context, m_sourceAlarmStr.toUtf8().data()); m_xxxText01-SetText(newText); // 如果已知只有一个上文xxxContextClase调用则直接填上文调用类的类名xxxContextClase即可 newText qApp-translate(xxxContextClase, m_sourceAlarmStr.toUtf8().data()); m_xxxText02-SetText(newText); // 适用于文本UI内容固定的场景如文本内容一直为 Alarm m_xxxText03-setText(tr(Alarm)); } // 重定义changeEvent函数捕捉LanguageChange语言切换事件调用RetranslateUi刷新UI文本 void xxxClass::changeEvent(QEvent *event) { if (event-type() QEvent::LanguageChange) { RetranslateUi(); } QWidget::changeEvent(event); }// 调用示例 void xxxContextClase::xxx_fun(void) { // metaObject()-className()会将自身的类名 xxxContextClase传给xxxClass的context用于其后续的UI刷新指向上下文 xxxClass *xxxDemo new xxxClass(this, metaObject()-className()); ... }③qApp-translate的使用函数原型[virtual] QString QTranslator::translate(const char *context, const char *sourceText, const char *disambiguation nullptr, int n -1) const Returns the translation for the key (context, sourceText, disambiguation). If none is found, also tries (context, sourceText, ). If that still fails, returns a null string. Note: Incomplete translations may result in unexpected behavior: If no translation for (context, sourceText, ) is provided, the method might in this case actually return a translation for a different disambiguation. If n is not -1, it is used to choose an appropriate form for the translation (e.g. %n file found vs. %n files found). If you need to programatically insert translations into a QTranslator, this function can be reimplemented. See also load().如我们定义了一个弹窗基础类主要功能是提示和选择主要本文显示有①主题②内容③确定和取消按钮。类似如下xxxxxx主题 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx提示 取消 确定这样当有多个父类调用此子类时都可以根据传入的context来记录父类对文本进行翻译见见示例②重写changeEvent函数。QT提取和生成多语言库QT中提取和生成语言库和在Windows系统还是linux系统上提取和生成语言库无关是纯粹的文本提取和生成语言库不过要注意翻译的时候根据需要选择的是32位还是64位。两种方式都是将源码中的 tr() 或 QT_TR_NOOP宏包含的需要翻译的文本提取出来生成.ts翻译文本对.ts文文本进行翻译完成后生成.qm语言库。方式1使用QT的qtcreator图形界面提取和生成语言库步骤1运行qtcreator加载工程文件如安装在ubuntu中的QT5.12.9版本运行qtcreatorsudo /opt/Qt5.12.9/Tools/QtCreator/bin/qtcreator或者直接打开windowns上的qtcreator。步骤2更新翻译QT-creator界面【工具】-【外部】-【Qt语言家】-【更新翻译】和 【发布翻译】更新翻译会在.pro文件中指定的TRANSLATIONS参数下生成对应的语言.ts文件如果已经存在则会更新对应的语言.ts文件如下会在translations目录下生成或更新en_US.ts 和zh_CN.ts文件只以中英文两种语言为例如果需要再生成其他语言库同理直接添加即可如再添加日语则添加 translations/ja-JP.ts世界语言代码Language Code Table# 翻译文件路径 TRANSLATIONS translations/en_US.ts translations/zh_CN.ts发布翻译会将.ts文件翻译生成对应的语言库.qm文件更新翻译后提示如下更新完成translations目录下生成.ts文件步骤3直接修改ts文件或运行linguist进行多语言翻译翻译可以选择直接在编辑器上修改ts文件和运行linguist上翻译两种方式。①直接修改ts文件ts文件实际上是一个xml文件直接可以用文本编辑器打开进行翻译。如下以zh_CN.ts为例source和/source之间是源码中 tr()或QT_TR_NOOP()包含的部分如源码中的tr(Please enter something...)translation typeunfinished/translation是需要翻译成什么语言直接替换unfinished即可如翻译成中文上述的typeunfinished替换成请输入...如translation请输入.../translation②使用linguist翻译如下根据最终app程序是64位还是32位选择对应的位数如app是在64位的linux系统中运行选择64位linguist进行翻译。文件--打开文件选择对应的.ts文件如下两个都选配置目标语言en_US语言English国家/地区可选任意国家或对应的国家对最终翻译和使用无影响zh_CN.ts语言Chinese国家/地区中国翻译后左键点击图标即可对翻译文本进行标记翻译完成。图标含义图标含义未翻译已翻译未标记完成已翻译且已标记完成已翻译未标记完成且译文和源文不匹配只做提示不影响翻译如源文有句号等译文没有。翻译后的.ts文件如下以zh_CN.ts为例全部翻译后点击保存然后【文件】-【发布全部】即可在translations目录下生成.qm语言库文件。生成.qm语言库至此翻译和生成语言库结束。运行效果点击切换语言按钮切换到对应语言中文英文以下为翻译常见问题补充m_alarmText-setText(tr(Move device in \∞\ pattern to calibrate.));源码中的\是为了转义字符但是在翻译中就直接不用翻译转义字符因为翻译后的是以字符串的形式保存即翻译是什么样显示即是什么样所以翻译直接如下即可再比如m_alarmText-setText(tr(hello,\nworld!));源码的效果即将hello后换行显示world如果英文翻译是hello,\nworld!那么显示的效果不会发生换行效果而是直接显示hello,\nworld!。要想达到换行效果有几种方式①最简单的直接在用 Qt Linguist 打开.ts文件找到对应条目在“翻译”文本框中直接按回车键Enter来换行不要输入\n。#英文 hello, nworld! #中文 你好 世界②使用 HTML 标签br代替\n最可靠修改源码直接在代码中将\n替换为使用 HTML 的br标签并确保控件支持富文本QLabel默认支持。源码m_alarmText-setTextFormat(Qt::RichText); // 显示强制设置为富文本大多数显示文本的控件如 QLabel、QTextEdit、QMessageBox默认就已经启用了富文本支持 m_alarmText-setText(tr(hello,brworld!));源码中如果使用中文中文翻译时同样用brtr(你好br世界)使用QT的Linguist翻译翻译文本中应同样包含br而不能使用回车或者\n代替br也不能删除br你好br世界优点翻译时直接写br无论什么情况下都能换行不受转义问题影响。兼容所有翻译翻译人员直接抄br即可不依赖 Qt 对\n的特殊处理未来如果需要加粗、颜色等格式也很方便Qt 的富文本Rich Text常用的 HTML 标签及其含义和用法见后续章节。方式2使用指令提取和生成语言库lupdate、lrelease、linguist都是 Qt 官方开发工具的一部分包含在 Qt 安装包中Qt SDK。 你只需要正常安装 Qt例如通过 Qt Online Installer 或系统包管理器这些工具就会自动安装在 Qt 的bin/目录下如C:\Qt\6.5.0\mingw64\bin或/usr/bin。关键文件lupdate提取源码中的tr()字符串生成/更新.ts翻译源文件linguist图形化编辑.ts文件填写翻译lrelease将.ts编译为.qm二进制文件程序运行时加载步骤1运行lupdate更新.ts文件打开终端命令行进入项目根目录.pro文件所在目录执行lupdate myproject.pro这会扫描所有.h、.cpp、.ui文件中的tr()、qsTr()、QT_TR_NOOP等并将新的字符串与已有翻译合并更新到TRANSLATIONS指定的每个.ts文件中。如果.ts文件不存在它会自动创建。lupdate . -ts myapp.ts – 扫描当前目录下所有源码生成/更新 myapp.ts lupdate -no-obsolete my.pro – 丢弃源码中不再存在的“过期”条目 lupdate -extensions cpp,h,ui . -ts myapp.ts – 只指定扩展名步骤2使用linguist编辑翻译以翻译成中文为例linguist translations/myapp_zh_CN.ts在图形界面中逐条填写翻译。完成后保存文件。步骤3使用lrelease生成.qm文件lrelease myproject.pro会为每个.ts文件生成对应的.qm文件通常放在与.ts相同目录。.qm文件体积小、加载快用于最终部署。lrelease myapp.pro – 处理 .pro 中 TRANSLATIONS 所有文件 lrelease myapp_zh_CN.ts -qm myapp_zh_CN.qm – 单独转换一个文件Qt 的富文本Rich Text和HTML 标签常用的 HTML 标签可以在QLabel、QTextEdit、QMessageBox等控件中使用以提供丰富的文本格式。1. 文本样式标签含义示例说明b粗体b粗体文字/b加粗显示i斜体i斜体文字/i倾斜显示u下划线u带下划线的文字/u文字下方加线s或strike删除线s删除的文字/s文字中间划横线big大字号big放大文字/big比默认字体大一号small小字号small缩小文字/small比默认字体小一号sup上标Xsup2/supX²sub下标Hsub2/subOH₂O2. 字体与颜色标签/属性含义示例font字体、大小、颜色font colorred size4红色文字/fontcolor属性文字颜色color#FF0000或colorredsize属性字号1-7size5face属性字体名称faceArial注Qt 推荐使用 CSS 样式而非font标签但两者都支持。3. 段落与布局标签含义示例说明br换行第一行br第二行强制换行不产生新段落p段落p这是一个段落/p段落前后会有间距div块级容器div aligncenter居中内容/div用于分组和布局align属性水平对齐alignleft/center/right可应用于p,div,h1等hr水平分割线hr显示一条横线4. 标题与列表标签含义示例说明h1~h6标题h2二级标题/h2字号依次减小加粗ul无序列表ulli项目1/lili项目2/li/ul带圆点符号ol有序列表olli第一项/lili第二项/li/ol带数字序号li列表项与ul或ol配合使用每个项目5. 链接与图片标签含义示例说明a超链接a hrefhttps://qt.ioQt官网/a支持点击信号需处理linkActivated信号img图片img src:/images/icon.png width32 height32支持资源路径或本地文件可设置宽高注意img在QLabel中默认显示但不会自动缩放QTextEdit中更灵活。6. 表格标签含义示例table表格table border1...tr表格行trtd行1列1/tdtd行1列2/td/trtd表格单元格th表头单元格加粗居中th姓名/th7. 常用 CSS 样式部分支持Qt 富文本支持内联 CSS 样式常用示例span stylefont-size:16px; color:blue; background-color:yellow;带背景色的文字/span div stylemargin:10px; padding:5px; border:1px solid black;带边框的块/div8. 应用示例翻译时翻译人员只需翻译标签之间的文本内容保留所有HTML 标签即可。示例1m_statusText-setText(tr(span style\color:#0082FF;\Updating/spanbr));作用在控件m_statusText上显示一段富文本内容。内容span stylecolor:#0082FF;定义了一个内联样式将文字颜色设置为蓝色#0082FF。Updating是实际显示的文字英文“更新中”。/span结束样式作用域。br在文本末尾添加一个换行可能用于后续内容或布局留空。效果界面上会显示一行蓝色的“Updating”然后换行光标或后续元素移到下一行。翻译文本// 只替换需要翻译的文本保留HTML标签 // 英文 span stylecolor:#0082FF;Updating/spanbr // 中文 span stylecolor:#0082FF;更新中/spanbr示例2m_alarmText-setText(tr( h2校准指引/h2 p请将设备b静止放置/b在水平面上br然后点击下方按钮/p ulli点击 font color\green\开始/font 进行校准/li li点击 font color\red\取消/font 退出/li/ul a href\https://example.com/help\查看帮助/a ));总结换行用br分段用p。加粗、斜体、颜色、字号用b、i、font或 CSS。列表、表格、图片、链接也可按需使用。多语言翻译时只翻译标签之间的纯文本不翻译标签本身。