上一节我们完成了搜索框基本的界面,但是光有外表是没用的,华而不实最终将会遭人唾弃。那我们还差哪些功能?
1.搜索按钮可以做成填了内容才启用,这样用户体验会好一点。
2.用tr实现国际化,我们用中文作为例子。
3.真正地实现文本查找。
针对上面的需求我们相应地给出解决方案:
1.1 可以在初始化的时候先把搜索按钮禁用,用setEnabled(false)来实现。
1.2 当用户在搜索框输入了内容的时候,搜索按钮自动启用,可以用信号槽connect一下实现(信号槽这里不赘述,此系列文章全都是讲实用,就像李小龙说的:一位老师从来就不是真理的施舍者,而是带领你让你自己去领悟真理。)
在init方法里searchButton实例化之后加一行:
//刚开始先禁用搜索按钮,等输入了搜索内容才启用 searchButton->setEnabled(false); connect(searchLineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableSearchButton(const QString &)));
在dialog.cpp定义开启搜索按钮的方法:
void FindDialog::enableSearchButton(const QString &text){ searchButton->setEnabled(!text.isEmpty());//判断是当文本不为空的时候启用 }
此时我们点击运行,搜索按钮是灰色的,这代表他不可用,我们输入内容,他变色了(额,别想歪了),好,功能1搞定。下面进入功能2:
2.1 打开dialog.pro下面加一行:TRANSLATIONS+=china.ts ,这个ts文件就是等下我们要去写中文的。
2.2 打开qt的命令行工具(一般在开始菜单里面可找到),进入项目目录,执行lupdate。下面是我本机的命令,请大家按照自己的环境改一下:
f: cd Qt/dialog lupdate dialog.pro
执行完之后他生成了一个china.ts, 并且会告诉你有多少个新词是没有翻译过的。你可以用记事本打开这个ts文件看一下,哦,原来是xml。
可以看到会有这种语句:<translation type="unfinished"></translation>,乍一看,这应该就是要填写中文的地方吧。我们先试试看行不行:
<source>&Search</source> <translation type="unfinished">搜索</translation>
保存,运行。没用,那该怎么整?呵呵,Qt给我们提供了一个工具,Qt Linguist,听说用他来打开ts文件再修改会简单点呢!
我们在开始菜单找到这个工具运行,把刚才的ts文件直接拖进去。弹出一个窗口,自行调节一下选项,一般默认就好了。
打开之后我们的中文注释乱码了,先不管:
在左边他会自动给你列出哪些是要翻译的。
点一下,然后在下面写入相应的翻译。
完了点击文件-发布。这时候我们再去dialog项目发现多了一个china.qm,我们用notepad打开china.qm文件看下,乱码,点击格式出来是ANSI码,这个先不管。
做完了翻译,我们还要在main.cpp里装入qm文件才行:
#include <QtGui/QApplication> #include <QTranslator> #include "finddialog.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); //载入翻译文件 QTranslator t; t.load("china.qm"); a.installTranslator(&t); FindDialog w; w.show(); return a.exec(); }
这时我们点击绿色播放按钮看看,果然成功了呢!嘿嘿
不过,标题怎么翻译呢?等等,我们好像还没有指定标题呢。。。我们在FindDialog.cpp的构造函数里加入一行设置窗口的标题吧:
FindDialog::FindDialog(QWidget *parent) : QDialog(parent)//构造函数 { setWindowTitle(tr("Qt demo1-FindDialog")); init();//初始化 }
然后怎么做?想想应该到命令行lupdate一下咯,完了他告诉你有1个新词,再回到Qt Linguist发现他没有自动帮我们更新文件,我们关了重新打开,看到多了一个标题可以翻译,翻译之后发布。可以看到china.qm的修改时间变成刚刚了。我们点击绿色播放按钮看看,标题也是中文的了:
我们回头看看china.ts到底是变成啥样了:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.0" language="zh_CN"> <context> <name>FindDialog</name> <message> <location filename="finddialog.cpp" line="13"/> <source>Qt demo1-FindDialog</source> <translation type="unfinished">Qt实例1-查找框</translation> </message> <message> <location filename="finddialog.cpp" line="24"/> <source>&Find what?</source> <translatorcomment>在这里输入你要搜索的内容吧</translatorcomment> <translation type="unfinished">你要查什么?</translation> </message> <message> <location filename="finddialog.cpp" line="33"/> <source>&Search</source> <translatorcomment>点击搜索,我们将快速为你匹配符合的内容。</translatorcomment> <translation type="unfinished">搜索</translation> </message> </context> </TS>
notice:假如内容是变量的情况下。下面的代码说明如何才能更好地实现国际化:
#include <QLabel> #include <QApplication> int main(int argc, char *argv[]){ QApplication a(argc, argv); QString var1 = "111"; QString var2 = "222"; //如果遇到字符是变量,下面这样将不能用于国际化 //QLabel *myLabel = new QLabel("a is "+var1+" and b is "+var2); //要用%连起来然后再arg QLabel *myLabel = new QLabel(QObject::tr("a is %1 and b is %2").arg(var1).arg(var2)); myLabel->show(); return a.exec(); }
3.为了实现真正地实现文本查找,要先做个文本编辑器,然后把这个查找框放到工具栏里。那么这些内容交给下一节吧。
代码下载地址:https://qt-example.googlecode.com/svn/trunk