找回密码
 立即注册
收起左侧

第7篇 基础(七)实现Qt文本查找功能

59
回复
38953
查看
  [复制链接]
累计签到:851 天
连续签到:1 天
来源: 2013-3-26 20:01:43 显示全部楼层 |阅读模式
实现Qt文本查找功能
版权声明

该文章原创于Qter开源社区(www.qter.org),作者yafeilinux,转载请注明出处!


导语

这一篇我们来加上查找菜单的功能。因为要涉及Qt Creator的很多实用功能,所以单独用一篇文章来介绍。以前都用设计器设计界面,而这次我们用代码实现一个简单的查找对话框。除了讲解怎么实现查找功能,这里还详细地说明了怎么进行类中方法的查找和使用。其中也讲解了Qt Creator程序中怎样在函数的声明位置和定义位置间进行快速切换。

环境是:Windows 7 + Qt 4.8.1+ Qt Creator 2.4.1


目录

一、添加查找对话框
二、实现查找功能


正文


一、添加查找对话框

1.我们继续在前一篇程序的基础之上进行更改。首先到mainwindow.h文件中添加类的前置声明(对于什么是前置声明,以及这样使用的好处,可以在网上百度):
class QLineEdit;
class QDialog;

前置声明所在的位置跟头文件包含的位置相同。
然后在private中添加对象定义:

QLineEdit *findLineEdit;
QDialog *findDlg;

下面再添加一个私有槽声明:
private slots:
    void showFindText();
槽可以看做是一个函数,只不过可以和信号进行关联。

2.下面到mainwindow.cpp文件中,因为前面在头文件中使用了类的前置声明,所以这里需要先添加头文件包含:
#include <QLineEdit>
#include <QDialog>
#include <QPushButton>

然后在构造函数中进行初始化操作,即添加如下代码:
findDlg = new QDialog(this);
findDlg->setWindowTitle(tr("查找"));
findLineEdit = new QLineEdit(findDlg);
QPushButton *btn= new QPushButton(tr("查找下一个"), findDlg);
QVBoxLayout *layout= new QVBoxLayout(findDlg);
layout->addWidget(findLineEdit);
layout->addWidget(btn);
connect(btn, SIGNAL(clicked()), this, SLOT(showFindText()));

这里创建了一个对话框,然后将一个行编辑器和一个按钮放到了上面,并使用布局管理器进行布局。最后将按钮的单击信号关联到了自定义的显示查找到的文本槽上。下面来添加该槽的定义。

3.这里先说一个可以快速从头文件声明处创建函数定义的方法。到mainwindow.h文件中,将鼠标定位到showFindText()函数上,然后点击右键,在弹出的菜单中选择“重构”→“在mainwindow.cpp添加声明”,或者直接使用Alt+Enter快捷键,这样就会直接在mainwindow.cpp文件中添加函数定义,并跳转到该函数处。如下图所示。


二、实现查找功能
下面我们来分步骤完成showFindText()函数。在讲解过程中会涉及一些很实用的功能的介绍。

1.先在函数中添加一行代码来获取行编辑器中要查找的字符串。
void MainWindow::showFindText()
{
   QString str = findLineEdit->text();
}

2.在下一行,我们先输入ui,然后按下键盘上的“>.”键,这时就会自动输入“.”或者“->”,并且列出ui上所有可用部件的对象名。如下图所示。


3.我们要输入textEdit,先输入t,这时会自动弹出textEdit,只需要按下回车键即可。如下图所示。


4.下面我们将光标放到textEdit上,这时就会出现QTextEdit类的简单介绍,如下图所示。


5.按照提示,我们按下键盘上的F1键,就会在编辑器的右侧打开QTextEdit类的帮助文档。如下图所示。这时还可以按下上面的“切换至帮助模式”来进入到帮助模式中打开该文档。


6.我们在该类的Public Functions公共函数列表中发现有一个find()函数。如下图所示。


7.从字面意思上可以知道该函数应该是用于查找功能的,我们点击该函数进入到它的详细介绍处。如下图所示。


8.根据介绍可以知道该函数用于查询指定的exp字符串,如果找到了就将光标跳转到查找到的位置,如果没有找到就返回false。这个函数还有一个QTextDocument::FindFlags参数,为了了解该参数的意思,我们点击该参数进入其详细介绍处。如下图所示。


可以看到该参数是一个枚举变量,用来指定查找的方式,分别是向后查找、区分大小写、全词匹配等。如果不指定该参数,默认的是向前查找、不区分大小写、包含该字符串的词也可以查找到。这几个变量还可以使用“|”符号来一起使用。

9.根据帮助,我们补充完该行代码:

ui->textEdit->find(str, QTextDocument::FindBackward);

10. 这时已经能实现查找的功能了。但是我们刚才看到find的返回值类型是bool型,而且,我们也应该为查找不到字符串作出提示。将这行代码更改为:

if (!ui->textEdit->find(str, QTextDocument::FindBackward))
{
   QMessageBox::warning(this, tr("查找"),
            tr("找不到%1").arg(str));
}

到这里查找函数就基本讲完了。

11. 我们会发现随着程序功能的增强,其中的函数也会越来越多,我们都会为查找某个函数的定义位置感到头疼。而在QtCreator中有几种快速定位函数的方法。

第一种,在函数声明的地方直接跳转到函数定义的地方。
例如我们在mainwindow.h文件的loadFile()函数上点击鼠标右键,在弹出的菜单上选择“在方法声明/定义之间切换”,这时就会自动跳转到mainwindow.cpp文件中该函数的定义处。如下图所示。当然还可以反向使用。


第二种,快速查看一个文件里的所有函数。
可以在编辑器正上方的下拉框里查看正在编辑的文件中所有的函数的列表,点击一个函数就会跳转到指定位置。如下图所示。


第三种,使用类视图或者大纲视图。
在项目列表上面的下拉框中可以更改查看的内容,如果选择为类视图或者大纲,则会显示文件中所有的函数的列表。如下图所示。


第四种,使用查找功能查看函数的所有调用处。
在一个函数名上点击鼠标右键,然后选择“查找何处被使用”菜单,这时就会在下面的搜索结果栏中显示该函数所有的使用位置。我们可以通过点击一个位置来跳转到该位置。如下图所示。



12.最后,我们来实现界面上的查找功能。从设计模式进入查找动作的触发信号的槽,更改如下:
void MainWindow::on_action_Find_triggered()
{
   findDlg->show();
}
这时运行程序,效果如下图所示。



结语

讲到这里,我们已经很详细地说明了怎样去使用一个类里面未接触过的函数;也说明了Qt Creator中的一些便捷操作。可以看到,Qt Creator开发环境,有很多很人性化的设计,我们应该熟练应用它们。在以后的文章中,我们不会再很详细地去用帮助来说明一个函数是怎么来的,该怎么用,这些应该自己试着去查找。



涉及到的代码:



上一篇:第6篇 实现Qt文本编辑功能

下一篇:第8篇 设置Qt状态栏

返回:系列教程目录  


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
参与人数 5人气 +9 收起 理由
FantasyDJC + 2 很详细!
xiaojunhust + 2 很实用!
zxj721 + 1 对我帮助很大!
FlySnail + 2
一代菜鸟 + 2 对我帮助很大!

查看全部评分总评分 : 人气 +9

回复

使用道具 举报

累计签到:83 天
连续签到:1 天
2013-6-1 14:27:37 显示全部楼层
QVBoxLayout  是不是要引用啊??
回复 支持 反对

使用道具 举报

累计签到:83 天
连续签到:1 天
2013-6-1 14:34:00 显示全部楼层
我的实现不了 第三步,就是ui->t  没有提示。
回复 支持 反对

使用道具 举报

累计签到:851 天
连续签到:1 天
2013-6-2 22:25:12 显示全部楼层
caikeyter 发表于 2013-6-1 14:34
我的实现不了 第三步,就是ui->t  没有提示。

啊,看下是什么提示都没有呢,还是就这个部件没有提示?
回复 支持 反对

使用道具 举报

累计签到:83 天
连续签到:1 天
2013-6-3 09:05:04 显示全部楼层
yafeilinux 发表于 2013-6-2 22:25
啊,看下是什么提示都没有呢,还是就这个部件没有提示?

重启QT Creator 就好了,估计是这个IDE 的缓存出错了。
回复 支持 反对

使用道具 举报

累计签到:7 天
连续签到:1 天
2013-10-5 09:24:35 显示全部楼层
比书里面的简单一点,能看懂
回复 支持 反对

使用道具 举报

累计签到:851 天
连续签到:1 天
2013-10-5 09:41:00 显示全部楼层
newair 发表于 2013-10-5 09:24
比书里面的简单一点,能看懂

网上的教程就是图片比书里的多,内容更少更简单。
回复 支持 反对

使用道具 举报

累计签到:7 天
连续签到:1 天
2013-10-5 10:27:34 显示全部楼层
yafeilinux 发表于 2013-10-5 09:41
网上的教程就是图片比书里的多,内容更少更简单。

现在很多人都在学android,qt还有前途吗?没想到yafeilinux能回复,谢谢
回复 支持 反对

使用道具 举报

累计签到:851 天
连续签到:1 天
2013-10-5 19:16:22 显示全部楼层
newair 发表于 2013-10-5 10:27
现在很多人都在学android,qt还有前途吗?没想到yafeilinux能回复,谢谢

现在qt也在向移动开发转移,不过嵌入式开发还是它的强项。

现在qt已经可以开发android和ios程序了。
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2014-1-24 22:28:50 显示全部楼层
一直头大的就是窗口输入信息的捕获和处理……
回复 支持 反对

使用道具 举报

累计签到:2 天
连续签到:1 天
2014-4-10 17:10:04 显示全部楼层
以前用vs编程  都是用匈牙利命名  Qt是用什么命名法则呢
回复 支持 反对

使用道具 举报

累计签到:6 天
连续签到:1 天
2014-4-23 12:07:59 显示全部楼层
qcreater 2.0.1没有这个功能啊!

将鼠标定位到showFindText()函数上,然后点击右键,在弹出的菜单中选择“重构”→“在mainwindow.cpp添加声明”
回复 支持 反对

使用道具 举报

累计签到:851 天
连续签到:1 天
2014-4-23 22:15:21 显示全部楼层
lyzyung 发表于 2014-4-10 17:10
以前用vs编程  都是用匈牙利命名  Qt是用什么命名法则呢

可以自己看下源代码啊!
回复 支持 反对

使用道具 举报

累计签到:4 天
连续签到:1 天
2014-4-27 23:51:04 显示全部楼层
QVBoxLayout用不了,编译出错error: 'QVBoxLayout' was not declared in this scope,这个怎么解决
   
   
回复 支持 反对

使用道具 举报

累计签到:4 天
连续签到:1 天
2014-4-27 23:53:22 显示全部楼层
GreenMaru 发表于 2014-4-27 23:51
QVBoxLayout用不了,编译出错error: 'QVBoxLayout' was not declared in this scope,这个怎么解决
   
    ...

额,我知道了,要声明头文件
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2014-6-8 21:36:28 显示全部楼层
照着做完了,感觉还好。不过要是能加上“查找到内容之后,把焦点切换到textEdit那里” 就更好了,目前查找到结果之后,焦点还在查找窗口那里。
回复 支持 反对

使用道具 举报

尚未签到

2015-3-9 21:54:06 显示全部楼层
(!ui->textEdit->find(str, QTextDocument::FindBackward)),为什么我的参数设为 QTextDocument::FindBackward,是从后向前查找的,有谁做了么
回复 支持 反对

使用道具 举报

累计签到:851 天
连续签到:1 天
2015-3-12 14:09:27 显示全部楼层
liuheng 发表于 2015-3-9 21:54
(!ui->textEdit->find(str, QTextDocument::FindBackward)),为什么我的参数设为 QTextDocument::FindBackwa ...

你可以试试另外的参数,看看效果。
回复 支持 反对

使用道具 举报

尚未签到

2015-3-12 14:27:08 显示全部楼层
yafeilinux 发表于 2015-3-12 14:09
你可以试试另外的参数,看看效果。

恩,试过了,去掉的话是从前往后查,很奇怪啊
回复 支持 反对

使用道具 举报

累计签到:851 天
连续签到:1 天
2015-3-17 11:44:29 显示全部楼层
liuheng 发表于 2015-3-12 14:27
恩,试过了,去掉的话是从前往后查,很奇怪啊

这个好像就是跟自己想的不一样。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册