Qt tr()函数不起效的小问题

Qt tr()函数不起效的小问题

最近在自学Qt,进展比较慢,使用的参考书籍是
中国工信出版集团 电子工业出版社 出版的 《Qt5 开发及实例(第2版)》
——————————————————————————————

问题描述

在涉及到多国语言翻译这一问题时,书中14章只介绍了基本的使用方法,但在书中第8章第2个例子中,结合tr()方法却不能完成翻译。
因为第8章第2个例子需要翻译的对象是由QAbstractTableModel这个类继承来的。
附上部分关键代码:
这是根据书中原例更改的程序,注意,此代码中直接使用了tr()函数

#include "modelex.h"

ModelEx::ModelEx(QObject *parent)
    :QAbstractTableModel(parent)
{
    armyMap[1] = tr("AirForce");
    armyMap[2] = tr("Navy");
    armyMap[3] = tr("GroundForce");
    armyMap[4] = tr("Marine");
    weaponTypeMap[1] = tr("Bomber");
    weaponTypeMap[2] = tr("Fighter");
    weaponTypeMap[3] = tr("Aircraft Carrier");
    weaponTypeMap[4] = tr("Destroyer");
    weaponTypeMap[5] = tr("Helicopter");
    weaponTypeMap[6] = tr("Tank");
    weaponTypeMap[7] = tr("Amphibious Assault Ship");
    weaponTypeMap[8] = tr("Amphibious Tank");
    populateModel();
}

void ModelEx::populateModel()
{
    header<<tr("Services")<<tr("Species")<<tr("Weapons");
    army<<1<<2<<3<<4<<2<<4<<3<<1;
    weaponType<<1<<3<<5<<7<<4<<8<<6<<2;
    weapon<<tr("B-2")<<tr("Nimitz Class")<<tr("Apachi")<<tr("Hornet Class")
         <<tr("Arley Burke Class")<<tr("AAAV")<<tr("M1A1")<<tr("F-22");
}

然而在按lupdate和lrelease方法生成.ts和.qm文件后,结果却是如下图所示:
Qt tr()函数不起效的小问题_第1张图片
翻译失败了。

可是为什么呢?
后来我去stackoverflow上查了一圈,有人提到,tr这个函数本质上是从Qobject这个类中调用的。
所以我将代码修改为:

#include "modelex.h"
#include 

ModelEx::ModelEx(QObject *parent)
    :QAbstractTableModel(parent)
{
    armyMap[1] = QObject::tr("AirForce");
    armyMap[2] = QObject::tr("Navy");
    armyMap[3] = QObject::tr("GroundForce");
    armyMap[4] = QObject::tr("Marine");
    weaponTypeMap[1] = QObject::tr("Bomber");
    weaponTypeMap[2] = QObject::tr("Fighter");
    weaponTypeMap[3] = QObject::tr("Aircraft Carrier");
    weaponTypeMap[4] = QObject::tr("Destroyer");
    weaponTypeMap[5] = QObject::tr("Helicopter");
    weaponTypeMap[6] = QObject::tr("Tank");
    weaponTypeMap[7] = QObject::tr("Amphibious Assault Ship");
    weaponTypeMap[8] = QObject::tr("Amphibious Tank");
    populateModel();
}

void ModelEx::populateModel()
{
    header<tr("Services")<tr("Species")<tr("Weapons");
    army<<1<<2<<3<<4<<2<<4<<3<<1;
    weaponType<<1<<3<<5<<7<<4<<8<<6<<2;
    weapon<tr("B-2")<tr("Nimitz Class")<tr("Apachi")<tr("Hornet Class")
         <tr("Arley Burke Class")<tr("AAAV")<tr("M1A1")<tr("F-22");
}

重新按照lupdate和lrelease方法操作,
于是翻译就成功了:
Qt tr()函数不起效的小问题_第2张图片

这时候打开.qm文件
Qt tr()函数不起效的小问题_第3张图片
注意左侧边框里上下文那里显示是QObject中的翻译文本。
而在修改之前,QObject中大量的翻译文本是在ModelEx中。这可能就是两种写法一个有效另一个无效的原因了。
所以还是要明确一点,tr()这个函数实际上是对QObject对象起作用的,如果像本例中,并非直接对QObject对象进行翻译(QAbstractTableModel不是QObject对象),则应该使用QObject::tr方法显式地进行调用。


参考网页:

[http://stackoverflow.com/questions/41672717/qt-translation-is-missing-for-class-with-tr]

[http://blog.csdn.net/tju355/article/details/7253133]

你可能感兴趣的:(OpenCV+Qt,tr,qt)