Qt语言家的使用(二)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Qt语⾔家的使⽤(⼆)
Qt 语⾔家的使⽤(⼆)
⼀个简单的⽤Qt语⾔家(Qt Linguist)翻译应⽤程序的例⼦,在上⼀次已经给⼤家介绍了。
这次我们要做⼀个稍微复杂点的应⽤程序,并看看Qt语⾔家是怎样完成程序翻译⼯作的。
由于我也是最近才发现的,所以如有错误,请指出,我会尽快更改的。
应⽤程序,并且命名为[指导]Qt语⾔家的使⽤”。
⽬标为桌⾯应⽤程⾸先同样的,建⽴⼀个空的Qt“
序,建⽴好的截图如下所⽰:
新建⼀个main.cpp⽂件,并且输⼊如下的代码:
//main.cpp主函数所在的位置
//20:27:24最后编辑
#include
#include
#include
int main(int argc,char**argv)
{
QApplication app(argc,argv);
QTranslator translator;
translator.load("zh_CN");
app.installTranslator(&translator);
//绘制界⾯
QLabel*label=new QLabel(QLabel::tr("Input value"));
QSpinBox*spinBox=new QSpinBox;
QPushButton*button=new QPushButton(QPushButton::tr("OK"));
QDial*dial=new QDial;
QWidget*window=new QWidget;
spinBox->setRange(0,65535);
dial->setRange(0,65535);
QGridLayout*layout=new QGridLayout;
layout->addWidget(label,0,0);
layout->addWidget(spinBox,0,1);
layout->addWidget(button,1,0);
layout->addWidget(dial,1,1);
window->setWindowTitle(QWidget::tr("--Set Value--"));
window->setLayout(layout);
window->show();
//连接信号和槽
QObject::connect(button,SIGNAL(pressed()),
qApp,SLOT(quit()));
QObject::connect(dial,SIGNAL(valueChanged(int)),
spinBox,SLOT(setValue(int)));
QObject::connect(spinBox,SIGNAL(valueChanged(int)),
dial,SLOT(setValue(int)));
return app.exec();
}
我们先运⾏⼀下,运⾏结果是这样的:
让我们来看⼀下⼀些关键代码。
QT ranslator translator;表明建⽴⼀个QT ranslator对象,translator.load( "zh_CN" );表明载⼊⼀个语⾔脚本,app.installT ranslator( &translator );的意思是应⽤程序载⼊该translator对象。
它是Qt语⾔家重要的组成部分。
为了正确地载⼊zh_CN这个翻译⽂件,我们必须在.pro⽂件后⾯添加⼀句:TRANSLATIONS +=
),让Qt语⾔家⾃动产zh_CN.ts”。
随后点击菜单上的⼯具->外部->Qt语⾔家->更新翻译(lupdate”
⽣.ts⽂件。
产⽣了翻译⽂件后,我们点击Ctrl+O打开它,看看它的内容是不是这个样⼦:
QLabel
Input value
QPushButton
OK
QWidget
--Set Value--
如果是这样的话,那么恭喜你,成功了。
不是的话回头看看你哪步出错了。
接下来我们要做⼀些⼩动作,看看Qt语⾔家是如何察觉出来的。
我们在源代码中添加两句话,如下蓝⾊所⽰:
//main.cpp主函数所在的位置
//20:27:24最后编辑
#include
#include
#include
int main(int argc,char**argv)
{
QApplication app(argc,argv);
QTranslator translator;
translator.load("zh_CN");
app.installTranslator(&translator);
//绘制界⾯
QLabel*label=new QLabel(QLabel::tr("Input value"));
QSpinBox*spinBox=new QSpinBox;
QPushButton*button=new QPushButton(QPushButton::tr("OK"));
QDial*dial=new QDial;
QWidget*window=new QWidget;
QLabel*desc=new QLabel(QLabel::tr("Set your favourite value."));
spinBox->setRange(0,65535);
dial->setRange(0,65535);
QGridLayout*layout=new QGridLayout;
layout->addWidget(label,0,0);
layout->addWidget(spinBox,0,1);
layout->addWidget(button,1,0);
layout->addWidget(dial,1,1);
layout->addWidget(desc,2,0);
window->setWindowTitle(QWidget::tr("--Set Value--"));
window->setLayout(layout);
window->show();
//连接信号和槽
QObject::connect(button,SIGNAL(pressed()),
qApp,SLOT(quit()));
QObject::connect(dial,SIGNAL(valueChanged(int)),
spinBox,SLOT(setValue(int)));
QObject::connect(spinBox,SIGNAL(valueChanged(int)),
dial,SLOT(setValue(int)));
return app.exec();
}
此时我们再运⾏更新翻译,概要信息栏出现了这样的⽂字:
“”
Updating 'zh_CN.ts'...Found 4 source text(s) (1 new and 3 already existing)
如果以前打开了zh_CN.ts ,那么会出现下⾯界⾯:
选择是,再看看zh_CN.ts ,是不是多了⼀项?
Set your favourite value.
我们知道了,如果更新了源代码,那么也要更新.ts ⽂件,这样Qt 语⾔家才能根据新的控件更新新的代码。
随后我们再来看看下⼀种情况。
将源代码新添加的两句话注释掉,保存,再运⾏更新翻译(lupdate ),输出的信息最后两句是:Updating 'zh_CN.ts'...
Found 3 source text(s) (0 new and 3 already existing)Kept 1 obsolete entries
表明我们需要翻译的地⽅只剩下3“处了,另外有⼀处由于不存在对应的控件,所以被标记为过时(obsolete ”)的了。
看看
zh_CN.ts ⽂件,是不是删除了上⾯的内容?
理论上说,将QLabel::tr()和QPushButton::tr()改写为QObject::tr()并且部署翻译是⾏得通的,我们就试试看。
哎呀,我们的.ts ⽂件变成这样了,尽管仍能做翻译,但是⽆法辨别控件属性,翻译起来有那么点不⽅便啊。
QObject
Input value
OK
-- Set Value --
现在我们开始⼿⼯翻译了。
将此xml ⽂件改成如下的样⼦:
QObject
Input value
输⼊值
OK
确定
--Set Value--
--设置数值--
),⽣成.qm⽂件,并且放在应⽤程序同⼀⽂件语⾔家的部署编译(lrelease”
保存,随后选择Qt“
夹中,运⾏结果如下所⽰:
好了,我们再修改⼀下源代码,将QLabel* label = new QLabel( QObject::tr( "Input value" ) );改为QLabel* label = new QLabel( QLabel::tr( "Input value" ) );,编译、运⾏,我们看到输⼊值退回Input Value英⽂了。
“”
再试试使⽤更新翻译(lupdate)看看,我们看到出现了这样的信息:
Found 3 source text(s) (1 new and 2 already existing)
Kept 1 obsolete entries
Same-text heuristic provided 1 translation(s)
heuristic,启发式地,表⽰Qt语⾔家启发式地找到了⼀个翻译,但它不确定。
我们看看究竟是什么翻译。
打开zh_CN.ts⽂件看看:
QLabel
Input value
输⼊值
QObject
Input value
输⼊值
OK
确定
--Set Value--
--设置数值--
我们看到,⼀个QLabel提供了翻译:Input value->输⼊值,但是标记了unfinished,⽽原来的QObject下⾯的Input value的翻译却标记了Obsolete。
⼤家知道是什么原因吗?
原来,我们执⾏更新翻译(lupdate)时,Qt语⾔家查找tr()函数的位置,并且写⼊.ts⽂件中,这样以便翻译的时候替换。
当修改源代码执⾏更新翻译后,Qt语⾔家会智能地决定哪些应该翻译、哪些不应该翻译。
类型unfinished表明这是需要翻译但未完成的,类型obsolete表明这条翻译在现有程序是找不到对应控件的,俗称过时的。
⽽lrelease是根据.ts⽂件,产⽣体积更⼩,更为紧凑的⼆进制
“”
的.qm⽂件。
了解了这些后我们对Qt语⾔家有了更为深⼊的了解。