Qt-国际化(语言切换)

2023-10-28

在Qt中,所有的输入部件和文本绘制方式对Qt支持的所有语言都提供了内置的支持。Qt内置的字体引擎可以在同一时间正确而且精细地绘制不同的文本,这些文本可以包含来自众多不同书写系统的字符。如果想了解更多的相关知识,可以在帮助中通过Overview of the Translation Process关键字查看。

Qt对把应用程序翻译为本地语言提供了很好的支持,可以使用Qt Linguist工具完成应用程序的翻译工作,这个工具在第1章就已经介绍过了,这里将进一步介绍。

使用Qt Linguist翻译工具

这一小节先通过一个简单的例子介绍Qt中翻译应用程序的整个过程,然后再介绍其中需要注意的方面,这部分内容可以通过Qt Linguist Manual关键字查看。在Qt中编写代码时要对需要显示的字符串调用tr()函数,完成代码编写后对这个应用程序的翻译主要包含3步:

①运行lupdate工具,从C++源代码中提取要翻译的文本,这时会生成一个.ts文件,这个文件是XML格式的;

②在Qt Linguist 中打开.ts文件,并完成翻译工作;

③运行lrelease工具,从.ts文件中获得.qm文件,它是一个二进制文件。这里的.ts文件是供翻译人员使用的,而程序运行时只需要使用.qm文件,这两个文件都是与平台无关的。

下面通过一个简单的例子来介绍整个翻译过程,该例子实现了将一个英文版本的应用程序翻译为简体中文版本。

  1. 第一步,编写源码。新建Qt Widgets应用,项目名称为myI18N,类名为MainWindow ,基类保持QMainWindow不变。建立完项目后,单击mainwindow.ui文件进入设计模式,先添加一个“&File”菜单,再为其添加一个“&New”子菜单并设置快捷键为Ctrl+N,然后往界面上拖入一个Push Button。
    在这里插入图片描述

下面再使用代码添加几个标签,打开mainwindow.cpp文件,添加头文件#include < QLabel>,然后在构造函数中添加代码:

 QLabel *label = new QLabel(this);
    label->setText(tr("hello Qt!"));
    label->move(100,50);

    QLabel *label2 = new QLabel(this);
    label2->setText(tr("password", "mainwindow"));
    label2->move(100,80);

    QLabel *label3 = new QLabel(this);
    int id = 123;
    QString name = "yafei";
    label3->setText(tr("ID is %1,Name is %2").arg(id).arg(name));
    label3->resize(150, 12);
    label3->move(100, 120);

这里向界面上添加了3个标签,因为这3个标签中的内容都是用户可见的,所以要调用tr()函数。在label2中调用tr()函数时还使用了第二个参数,其实, tr()函数共有3个参数,它的原型如下:

QString Q0bject::tr(const char* sourceText,const char *disambiguation= Q_NULILPTR,int n =-1)[static]

第一个参数 sourceText就是要显示的字符串, tr()函数会返回sourceText 的译文。

第二个参数 disambiguation是消除歧义字符串,比如这里的password,如果一个程序中需要输入多个不同的密码,那么在没有上下文的情况下就很难确定这个password到底指哪个密码。这个参数一般使用类名或者部件名,比如这里使用了mainwindow,就说明这个password是在 mainwindow上的。

第三个参数n表明是否使用了复数,因为英文单词中复数一般要在单词末尾加“s”,比如“1 message”,复数时为“2messages”。遇到这种情况,就可以使用这个参数,它可以根据数值来判断是否需要添加“s”,例如:

int n = messages.count();
showMessage(tr("%n message(s) saved","",n));

tr()函数3个参数更多的用法介绍可以在帮助中通过 Writing Source CodeTranslation关键字查看。

  1. 第二步:更改项目文件。要在项目文件中指定生成的.ts文件,每一种翻译语言对应一个. ts文件。

打开myl18N.pro 文件,在最后面添加如下一行代码;

TRANSLATIONS = myI18N_zh_CN.ts

这就表明生成的.ts文件的文件名是以myI18N_zh_CN.ts
可以随便写,这里的_zh_CN是为了表示简体中文
最后crts+s保存

3.第三步,使用lupdate生成.ts文件。当要进行翻译工作时,先要使用lupdate工具来提取源代码中的翻译文本,生成. ts文件。

选择“工具→外部→Qt语言家→更新翻译(lupdate)”菜单项
在这里插入图片描述
从概要信息输出栏中可以看到,更新了myll8N_zh_CN.ts文件,发现了8个源文本,其中有8条新的翻译和0条已经存在的翻译。
在这里插入图片描述
这表明可以对程序代码进行更改,然后多次运行lupdate,而只需要翻译新添加的内容。

可以在项目目录中使用写字板打开这个.ts文件,可以看到它是XML格式的,其中记录了字符串的位置和是否已经被翻译等信息。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
    <name>MainWindow</name>
    <message>
        <location filename="mainwindow.ui" line="14"/>
        <source>MainWindow</source>
        <translation>应用程序主窗口</translation>
    </message>
    <message>
        <location filename="mainwindow.ui" line="27"/>
        <source>PushButton</source>
        <translation>按钮</translation>
    </message>
    <message>
        <location filename="mainwindow.ui" line="42"/>
        <source>&amp;File</source>
        <translation>文件(&amp;F)</translation>
    </message>
    <message>
        <location filename="mainwindow.ui" line="59"/>
        <source>&amp;New</source>
        <translation>新建(&amp;N)</translation>
    </message>
    <message>
        <location filename="mainwindow.ui" line="62"/>
        <source>Ctrl+N</source>
        <translation>Ctrl+N</translation>
    </message>
    <message>
        <location filename="mainwindow.cpp" line="12"/>
        <source>hello Qt!</source>
        <translation>你好 Qt!</translation>
    </message>
    <message>
        <location filename="mainwindow.cpp" line="16"/>
        <source>password</source>
        <comment>mainwindow</comment>
        <translation>密码</translation>
    </message>
    <message>
        <location filename="mainwindow.cpp" line="22"/>
        <source>ID is %1,Name is %2</source>
        <translation>账号是%1,名字是%2</translation>
    </message>
</context>
</TS>

  1. 第四步,使用Qt Linguist完成翻译。这一步一般是翻译人员来做的,就是在QtLinguist中打开.ts文件,然后对字符串逐个翻译。

在系统的开始菜单(Qt 5.6.0分类下)启动Linguist(打开Linguist的方法),然后单击界面左上角的打开图标(快捷键Ctrl+O),在弹出的文件对话框中进入项目目录,打开 myIl8N_ zh_CN文件,这时整个界面如图所示。QtLinguist窗口主要由以下几部分组成:在这里插入图片描述

  1. 菜单栏和工具栏在这里插入图片描述在这里插入图片描述

  2. 上下文窗口在这里插入图片描述

  3. 在这里插入图片描述
    在这里插入图片描述

  4. 短语和表单
    在这里插入图片描述

  5. 翻译区域在这里插入图片描述

  6. 短语和猜测在这里插入图片描述

  7. 警告窗口在这里插入图片描述
    下面来翻译程序。在翻译区域可以看到现在已经是要翻译成汉语,这是因为. ts文件名中包含了中文的区域代码。
    如果这里没有正确显示要翻译成的语言,那么可以使用“编辑→翻译文件设置”菜单项来更改。
    在这里插入图片描述

下面首先对 Main Window进行翻译,在汉语译文处翻译为“应用程序主窗口”,然后按下Ctrl+Return(即回车键)完成翻译并开始翻译第二个字符串。
在这里插入图片描述
在这里插入图片描述

按照这种方法完成所有字符串的翻译工作,如表所列,其中的一些翻译问题放到下一节再讲。在这里插入图片描述
翻译完成后按下Ctrl+S保存更改。这里对Qt Linguist只是进行了简单的介绍,详细内容可以在帮助中通过Qt Linguist Manual:Translators关键字查看。

  1. 第五步,使用 Irelease生成.qm文件。可以在Qt Linguist 中使用“文件→发布”和“文件→另外发布为” 两个菜单项来生成当前已打开的.ts文件对应的.qm文件,文件会生成在.ts所在目录下。

还可以通过Qt Creator的“工具→外部→Qt语言家→发布翻译(lrelease)”菜单项来完成。

  1. 第六步,使用.qm文件。下面在项目中添加代码并使用.qm文件来更改界面的语言。
    进人 main.cpp文件,添加头文件#include < QTranslator>,然后在“QApplica-tion a(argc,argv)”;代码下添加如下代码:
QTranslator translator;
    translator.load("../myI18N/myI18N_zh_CN.qm");
    a.installTranslator(&translator);

…表示当前项目工程目录,使用了相对路径
为QApplication a对象使用了翻译

注意,这几行代码一定要放到创建部件的代码之前
image-20220410225455768

比如这里放到了“Main Window;”一行代码之前

这样才能对该部件进行翻译。另外,有时可能因为部件的大小问题使得翻译后的文本无法完全显示,较好地解决方法就是使用布局管理器。

现在可以运行程序查看效果。
在这里插入图片描述

项目程序代码:代码我就不贴了
项目

程序翻译中的问题

1 对所有用户可见的文本使用QString

因为QString内部使用了Unicode编码,所以世界上所有的语言都可以使用熟悉的文本处理操作来进行处理。而且,因为所有的Qt函数都使用QString 作为参数来向用户呈现文本内容,所以没有char *到QString的转换开销。

2 对所有字符串文本使用tr()函数

无论什么时候使用要呈现给用户的文本,都要使用tr()函数进行处理

LoginWidget::LoginWidget()
{
 QLabel*label=new QLabel(tr("Password:"));
}

如果引用的文本没有在QObject子类的成员函数中,那么可以使用一个合适的类的tr函数,或者直接使用QCoreApplication::translate()函数。

void some_global_function(LoginWidget *logwid)
{
	QLabel* label=new QLabel(
				LoginWidget::tr("Password:"),logwid);			
}
void some_global_function(LoginWidget *logwid)
{
	QLabel* label=new QLabel(
	 	qApp->translate("LoginWidget","Password:"),logwid);
}

如果要在不同的函数中使用要翻译的文本,那么可以使用QT_TR_NOOP()宏和QT_TRANSLATE_NOOP()宏,它们仅仅对该文本进行标记来方便lupdate工具提取。

使用QT_TR_NOOP()的例子:

QString FriendlyConversation::greeting(int type)
{
 static const char *greeting_strings[] ={
	QT_TR_NOOP("Hello")QT_TR_NOOP("Goodbye")
	};
return tr(greeting_strings[type]);
}

使用QT_TRANSLATE_NOOP()的例子:

static const char * greeting_strings[]=
{
QT_TRANSLATE_NOOP("FriendlyConversation" ,"Hell1o"),
QT_TRANSLATE_NOOP("FriendlyConversation","Goodbye")
};


QString FriendlyConversation::greeting(int type)
{
return tr(greeting_strings[type]);
}

QString global_greeting(int type)
{
return qApp->translate("FriendlyConversation",
greeting_strings[type]);
}

3 对加速键的值使用QKeySequence()函数

类似于Ctrl+Q或者Alt+F等加速键的值也需要被翻译。如果使用了硬编码的Qt::CTRL+Qt::Key_Q作为退出操作的快捷键,那么翻译将无法覆盖它。正确的习惯用法为:

exitAct=new QAction(tr("E&xit"),this);
exitAct->setShortcuts(QKeySequence::Quit);

4 对动态文本使用QString::arg()函数

对于字符串中使用arg()函数添加的变量,其中的%1、%2等参数的顺序在翻译时可以改变,它们对应的值不会改变。

5 支持编码

QTextCodec类以及QTextStream使得Qt可以很容易地支持大量用户数据的输入和输出编码。当一个应用程序启动时,机器的语言环境便会决定处理8位数据(例如,字体选择、文本显示,8位文本I/O和字符输入等)时使用的8位编码。
应用程序有时也需要使用默认的本地8位编码以外的编码,例如,使用ISO 8859 -5编码,代码如下:

QString string=.....; //一些Unicode文本

//换编码格式
QTextCodec *codec=QTextCodec::codecForName("ISO 8859-5");
QByteArray encodedString=codec->fromUnicode(string);

如果要将Unicode转换为本地8位编码,那么可以使用QString::toLocal8Bit()函数;

还有一个QString :: toUtf8()函数可以返回使用8位UTF-8编码的文本。

要将其他编码转换为Unicode编码,那么可以使用QTextCodec类的 toUnicode()函数,还有QString : : fromUtf8()和QString : : fromLocal8Bit()等。
使用QTextCodec::codecForLocale()返回的编码是最重要的一个编码,因为这个是用户与他人或者其他应用程序进行通信最有可能使用的编码。

6.翻译非QT类

如果要使一个类中的字符串支持国际化,那么该类或者继承自QObject类或者使用Q_OBJECT宏。而对于非Qt类,如果要支持翻译,需要在类定义的开始使用Q_DECLARE_TR_FUNCTIONS()宏,例如:

class MyClass
{
 	Q_DECLARE_TR_FUNCTIONS(MyClass)
 	
 	public:
 	MyClass();
 	....
};

这样就可以在该类中使用tr函数了

7 自动判断语言环境

如果在一个程序中提供了多种语言选择,那么最好的方法就是在程序启动时判断本地的语言环境,然后加载对应的.qm文件。

可以使用QLocale::system().name()来获取本地的语言环境,它会返回QString类型的“语言_国家”格式的字符串,其中的语言用两个小写字母表示,符合ISO 639编码;国家使用两个大写字母表示,符合ISO3166国家编码。例如,中国简体中文的表示为“zh_CN”.

可以使用这个返回值来调用不同的文件,使应用程序自动使用相应的语言。

其他

国际化中还有本地化,在应用程序运行时动态进行语言更改等内容,这里就不再介绍,感兴趣的读者可以在帮助中通过Internationalization关键字参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt-国际化(语言切换) 的相关文章

  • 用 C++/Qt 编写的程序中的 RTF / doc / docx 文本提取

    我正在写一些程序Qt https en wikipedia org wiki Qt 28software 29 C 我需要从中读取文本微软Word https en wikipedia org wiki Microsoft Word RTF
  • QMutex 是否需要是静态的,以便此类实例的其他线程调用知道暂停其操作?

    从多个线程调用以下附加函数 我不希望数据重写附加 因为计数器尚未增加 除了当前使用 Append 的线程之外 这是否会挂起所有进入的线程 或者其他线程会继续运行而不追加数据吗 互斥锁是否需要是 静态 的 或者每个实例都知道要暂停操作吗 如果
  • 如何在QT上暂停和重新启动Qtimer

    我有 Ubuntu 我正在使用 IDEQT on C 我将暂停和恢复计时器 例如 void Ordonnancer les taches on pushButton clicked connect dataTimer SIGNAL time
  • QMainWindow 上的 Qt 布局

    我设计了一个QMainWindow with QtCreator s设计师 它由默认的中央小部件 aQWidget 其中包含一个QVBoxLayout以及其中的所有其他小部件 现在我想要的一切就是QVBoxLayout自动占据整个中央小部件
  • 如何在Qt 5中的paintEvent上使用mouseMoveEvent?

    我是 Qt 和 c 的新手 所以我遇到了一些困难 我正在尝试创建一个小部件 它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制椭圆 下面你可以看到代码 include myimage h include
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • 在 Qt 中使用多个不同的流读取同一文件

    使用 Qt 是否可以使用多个流读取文件以同时访问其中的不同数据部分 请注意 Qt 中的流 QTextStream QDataStream 不处理底层设备中的位置 流类只是一个包装器 用于更轻松地解析设备 QFile 实例 内的二进制数据 因
  • Mac OS X 上的 Qt 字体系列和样式

    我有一个基于 Qt PyQt 的 GUI 应用程序 在 Mac OS X 和其他平台 上运行 它允许用户选择字体并具有粗体和斜体选项的复选框 在更新到新的基于 Cocoa 的 Qt 时 用户发现QFontComboBox不再显示不同的字体样
  • Qt中Q_PROPERTY的意义是什么?

    我无法理解 Q PROPERTY 的用法 Q PROPERTY 如何帮助程序具有防御性 它是干什么用的 我看过这个论坛 但确实无法应用 我已经理解了这个例子 但不明白它的用法 这是一个例子 我能从中得到什么 我知道阅读将赋予只读特权 wri
  • Qt中用于线程间通信的类设计

    问题陈述 用相机跟踪物体并相应地移动相机的方位角和仰角 Process 相机获取物体的图像 处理相机的每一帧以查找物体 应该被跟踪 并将每帧中生成的信息传递给机械设备 万向节 以平移和倾斜方式移动摄像机 Design 主 Gui 在一个线程
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • Qt QML 数据模型似乎不适用于 C++

    我一直在使用中的示例http doc qt digia com 4 7 qdeclarativemodels html http doc qt digia com 4 7 qdeclarativemodels html这是 QML 声明性数
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • QTabWidget 选项卡在垂直方向,但文本在水平方向

    我正在尝试用 C Qt 制作一个带有这样的侧边栏的应用程序 但是当将 QTabWidget 方向设置为西时 它会使文本垂直 如何让文本位于左侧 但水平对齐 PS 我不需要图标 提前致谢 您可以使用QListWidget http doc q
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • PyQt5 使动态小部件可点击并将参数传递给另一个函数

    我正在尝试制作动态小部件并使它们可点击 通过单击一个小部件 它应该将动态值传递给其他小部件 我尝试过 sender 和其他访问小部件的选项 但没有任何效果 所有小部件都从最后一个小部件发送信息 下面是代码 import sys from P
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 如何在不声明 32 个插槽的情况下将 32 个按钮的 pressed() 信号连接到单个函数?

    我有一个小部件 里面有 32 个按钮 我需要将每个按钮的 Pressed 信号连接到一个插槽 以便调用一个函数 该函数的参数取决于我按下的按钮 现在我通过以 on QPushButtonName pressed 的形式添加 32 个插槽来做

随机推荐

  • react非受控组件useRef方法

    效果图如下 代码如下 div div
  • espcms5.7.13 sql注入漏洞复现

    espcms5 7 13 sql注入漏洞复现 作者 admin 时间 2021 06 28 分类 漏洞复现 使用代码审计工具自动审计 找到select语句 双击进入 adminsoft control citylist php文件可以看到
  • J-LINK 操作使用指南

    一 安装J LINK驱动 我们提供的驱动版本有v6 14d的版本 默认配置安装即可 安装完成后 将J LINK插入电脑在设备管理器中将会显示J LINK端口 二 固件下载及配置 J LINK安装完成后 进入J FLASH界面如下 配置J F
  • linux TTY子系统(2) -- 软件框架

    了解tty 子系统 1 TTY的子系统 在Linux kernel中 TTY就是各类终端 Terminal 的简称 为了简化终端的使用 以及终端驱动程序的编写 Linux kernel抽象出了TTY framework 对上 向应用程序提供
  • C语言 蓝桥杯 基础练习 01字串

    C语言 蓝桥杯 基础练习 01字串 描述 对于长度为5位的一个01串 每一位都可能是0或1 一共有32种可能 它们的前几个是 00000 00001 00010 00011 00100 请按从小到大的顺序输出这32种01串 输入 输入描述
  • 边缘计算2.0时代,“云边缘”与“边缘云”你分清了吗?

    5G时代的来临 意味着整个世界的连接 计算 和沟通方式都将迎来巨大的改变 这样的改变挑战着每一个人对于未来的想象力 越来越多的 低时延 大带宽 业务需求将会涌现 与此同时 大规模的数据激增也给整个行业和企业带来了不小的挑战 2020年对于全
  • PS批量给图片加水印

    一 打开PS 导入图片 点击菜单栏 文件 打开 载入一张需要设置文字水印的图片 二 点击菜单栏 窗口 动作 打开Photshop的动作组工作台窗口 先点击新建组图标新建一个组类别 再点击新建动作图标新建一个动作 新建后自动开始录制 名称均为
  • Matlab中hold on与hold off的用法

    摘录自 https blog csdn net smf0504 article details 51830963 https www cnblogs com shuqingstudy p 4853936 html 一 hold指令使用 正常
  • Java web实现简登录页面(MyBatis+jsp+servlet+html+css+javascript)附源码

    本文利用MyBatis jsp servlet html css javascript实现了一个简单的登录页面 对用户输入的用户名和密码就行校验 校验通过则登录成功 密码和用户信息保存在mysql表中 通过MyBatis访问 MyBatis
  • 【Redis】高并发下缓存穿透缓存雪崩解决方案

    高并发下缓存穿透缓存雪崩解决方案 高并发下缓存穿透 缓存雪崩的解决方案 缓存穿透及其解决方案 缓存雪崩及其解决方案 使用双重检查锁需要注意的点 高并发下缓存穿透 缓存雪崩的解决方案 缓存穿透及其解决方案 缓存穿透指的是在缓存系统中请求一个不
  • Java8之 LocalDate,LocalDateTime和处理时间、日期工具类一网打尽

    article details 128433011 1 java 支持日期格式化 2 获取今天日期 3 获取年 月 日信息 4 设置特定日期 5 判断两个日期是否相等 6 检查像信用卡还款这种周期性事件 7 获取当前时间 8 在现有的时间上
  • Git原理

    Git原理 一 版本控制系统 2 Git与SVN的区别 3 工作区 暂存区 本地仓库 远程仓库 3 暂存区 index 4 Git结构 Git 注意 常见命令 参考文献 一 版本控制系统 1 集中式版本控制系统 数据都保存在中央服务器 SV
  • [maven]关于pom文件中的<relativePath>标签

    关于pom文件中的
  • 每个 JavaScript 开发人员都应该知道的 7 个速记优化技巧

    每种语言都有自己的怪癖 最常用的编程语言JavaScript也不例外 本文将介绍大量JavaScript 速记优化技巧 这些技巧可以帮助您编写更好的代码 并确保您在遇到它们时不会做出以下反应 1 多字符串检查 通常您可能需要检查 astri
  • c++ string 堆还是栈_C++ GCC STL std::string实现 (短字符串优化)

    写在前面 本笔记介绍了C 11之后的GCC string的核心数据成员 以及短字符串的栈上优化 C 11之前与之后string的实现完全不同 这个SO回答写的很好 简而言之 c 11之前实现的是COW string C 11之后实现的就是实
  • C#系列-超市银行系统

    Acer cs using System using System Collections Generic using System Linq using System Text using System Threading Tasks n
  • 开源软件介绍说明

    https www oschina net project tag 81 db optimization
  • Android Thread.UncaughtExceptionHandler捕获

    在Java 的异常处理机制中 如果抛出的是Exception异常的话 必须有try catch 进行处理 属于checked exception 如果抛出的是RuntimeException异常的话 则不是必须进行try catch 异常处
  • C++ 使用ffmpeg将本地视频推送到远程服务器

    1 包含必须的头文件 extern C include
  • Qt-国际化(语言切换)

    在Qt中 所有的输入部件和文本绘制方式对Qt支持的所有语言都提供了内置的支持 Qt内置的字体引擎可以在同一时间正确而且精细地绘制不同的文本 这些文本可以包含来自众多不同书写系统的字符 如果想了解更多的相关知识 可以在帮助中通过Overvie