Qt实例1 - 查找框(2)实现功能

上一节我们完成了搜索框基本的界面,但是光有外表是没用的,华而不实最终将会遭人唾弃。那我们还差哪些功能?

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>&amp;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>&amp;Find what?</source>
        <translatorcomment>在这里输入你要搜索的内容吧</translatorcomment>
        <translation type="unfinished">你要查什么?</translation>
    </message>
    <message>
        <location filename="finddialog.cpp" line="33"/>
        <source>&amp;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

posted @ 2013-01-10 14:53  pigfly  阅读(3916)  评论(0编辑  收藏  举报