当前位置:嗨网首页>书籍在线阅读

04-tr()函数的使用

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

16.1.2 tr()函数的使用

为了让Qt能自动提取程序中用户可见的字符串,对于每个字符串都需要使用tr()函数封装。tr()是QObject的一个静态函数,在使用了Q_OBJECT宏定义的类或QObject的子类中,都可以直接使用tr()函数,否则需要使用QObject::tr()进行调用。或者在类定义中用Q_DECLARE_TR_FUNCTIONS宏把tr()函数添加到类中之后,再直接调用tr()函数。

tr()函数的定义是:

 QString QObject::tr(const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1)

其中,sourceText是源字符串,disambiguation是为翻译者提供额外信息的字符串,用于对一些容易混淆的地方作说明,内容如下:

LabCellPos = new QLabel(tr("当前单元格:"),this);
QMessageBox::information(this, tr("信息"), tr("信息提示?"),
            QMessageBox::Yes);
QString  str1=tr("左右", "大约的意思");
QString  str2=tr("左右", "掌握、控制的意思");

使用tr()函数,需要注意以下一些事项。

  • 尽量使用常量字符串,不要使用字符串变量。在tr()函数中应直接传递字符串常量,而不是用变量传递字符串,如下面的代码使用了字符串变量,使用lupdate工具提取项目中的字符串时,将不能提取“不能删除记录”这个字符串。
char *errorStr="不能删除记录";
QString str2=tr(errorStr);
  • 使用字符串变量时需要用Qt_TR_NOOP()宏进行标记。若要在tr()函数中使用字符串变量,需要在定义字符串的地方用Qt_TR_NOOP()宏进行标记,这在使用字符串数组时比较有用,例如:
const char *cities[4]={Qt_TR_NOOP("Beijing"), 
            Qt_TR_NOOP("Shanghai"), 
            Qt_TR_NOOP("Qingdao"), 
            Qt_TR_NOOP("Wuhan")   };
for (int i=0; i<4; i++)
   comboBox->addItem(tr(cities[i]));
  • tr()不能使用拼接的动态字符串。tr()不能使用拼接的动态字符串,例如,下面的用法是错误的:
LabCellPos->setText(tr("第"+ QString::number(current.row()) +"行");

正确的方式如下。

LabCellPos->setText(tr("第 %1 行").arg(current.row()));

翻译的字符串是"第 %1 行",然后再用QString的arg()去替换占位符“%1”的内容。

  • Qt_NO_CAST_FROM_ASCII 的作用。在一个需要翻译为多语言的应用程序中,如果编写程序时忘了对某个字符串使用tr()函数,lupdate生成的翻译资源文件就会遗漏这个字符串。为了避免这种疏忽错误,可以在项目配置文件(.pro文件)中添加如下的定义:
 DEFINES += Qt_NO_CAST_FROM_ASCII

这样在编译时,会禁止从const char* 到QString的隐式转换,强制每个字符串都必须使用tr()或QLatin1String()封装,避免出现遗漏未翻译的字符串。