• 7518阅读
  • 0回复

七、Qt Creator实现文本查找(原创) [复制链接]

上一主题 下一主题
离线yafei86
 
只看楼主 倒序阅读 楼主  发表于: 2009-11-07
http://hi.baidu.com/yafeilinux/blog/item/761adccd699f1a1a00e9287d.html
查看原文。
现在加上查找菜单的功能。因为这里要涉及关于Qt Creator的很多实用功能,所以单独用一篇文章来介绍。
以前都用设计器设计界面,而这次我们用代码实现一个简单的查找对话框。对于怎么实现查找功能的,我们详细地分步说明了怎么进行类中方法的查找和使用。其中也将Qt Creator智能化的代码补全功能和程序中函数的声明位置和定义位置间的快速切换进行了介绍。
1.首先还是保存以前的工程,然后再将其打开。
我们发现Qt Creator默认的字体有点小,可以按下Ctrl键的同时按两下+键,来放大字体。也可以选择Edit->Advanced->Increase Font Size。

2.在mainwindow.h中加入#include <QLineEdit>的头文件包含,在private中添加
QLineEdit *find_textLineEdit; //声明一个行编辑器,用于输入要查找的内容
在private slots中添加
void show_findText();
在该函数中实现查找字符串的功能。
3.我们进入查找菜单的触发事件槽函数,更改如下。
void MainWindow::on_action_Find_triggered()
{
QDialog *findDlg = new QDialog(this);
//新建一个对话框,用于查找操作,this表明它的父窗口是MainWindow。
findDlg->setWindowTitle(tr("查找"));
//设置对话框的标题
find_textLineEdit = new QLineEdit(findDlg);
//将行编辑器加入到新建的查找对话框中
QPushButton *find_Btn = new QPushButton(tr("查找下一个"),findDlg);
//加入一个“查找下一个”的按钮
QVBoxLayout* layout = new QVBoxLayout(findDlg);
layout->addWidget(find_textLineEdit);
layout->addWidget(find_Btn);
//新建一个垂直布局管理器,并将行编辑器和按钮加入其中
findDlg ->show();
//显示对话框
connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText()));
//设置“查找下一个”按钮的单击事件和其槽函数的关联
}
这里我们直接用代码生成了一个对话框,其中一个行编辑器可以输入要查找的字符,一个按钮可以进行查找操作。我们将这两个部件放到了一个垂直布局管理器中。然后显示这个对话框。并设置了那个按钮单击事件与show_findText()函数的关联。


5.下面我们开始写实现查找功能的show_findText()函数。
void MainWindow::show_findText()//“查找下一个”按钮的槽函数
{
QString findText = find_textLineEdit->text();
//获取行编辑器中的内容
}
先用一个QString类的对象获得要查找的字符。然后我们一步一步写查找操作的语句。
6.在下一行写下ui,然后直接按下键盘上的“<.”键,这时系统会根据是否是指针对象而自动生成“->”或“.”,因为ui是指针对象,所以自动生成“->”号,而且弹出了ui中的所有部件名称的列表。如下图。


7.我们用向下的方向键选中列表中的textEdit。或者我们可以先输入text,这时能缩减列表的内容。


8.如上图我们将鼠标放到textEdit上,这时便出现了textEdit的类名信息,且后面出现一个F1按键。我们按下键盘上的F1,便能出现textEdit的帮助。


9.我们在帮助中向下拉,会发现这里有一个find函数。


10.我们点击find,查看其详细说明。

11.可以看到find函数可以实现文本编辑器中字符串的查找。其中有一个FindFlags的参数,我们点击它查看其说明。

12.可以看到它是一个枚举变量(enum),有三个选项,第一项是向后查找(即查找光标以前的内容,这里的前后是相对的说法,比如第一行已经用完了,光标在第二行时,把第一行叫做向后。),第二项是区分大小写查找,第三项是查找全部。
13.我们选用第一项,然后写出下面的语句。
ui->textEdit->find(findText,QTextDocument::FindBackward);
//将行编辑器中的内容在文本编辑器中进行查找

当我们刚打出“f”时,就能自动弹出textEdit类的相关属性和方法。


可以看到,当写完函数名和第一个“(”后,系统会自动显示出该函数的函数原型,这样可以使我们减少出错。



14.这时已经能实现查找的功能了。但是我们刚才看到find的返回值类型是bool型,而且,我们也应该为查找不到字符串作出提示。
if(!ui->textEdit->find(findText,QTextDocument::FindBackward))
{
QMessageBox::warning(this,tr("查找"),tr("找不到 %1")
.arg(findText);
}
因为查找失败返回值是false,所以if条件加了“!”号。在找不到时弹出警告对话框。


15.到这里,查找功能就基本上写完了。show_findText()函数的内容如下。


我们会发现随着程序功能的增强,其中的函数也会越来越多,我们都会为查找某个函数的定义位置感到头疼。而在Qt Creator中有几种快速定位函数的方法,我们这里讲解三种。
第一,在函数声明的地方直接跳转到函数定义的地方。
如在do_file_Load上点击鼠标右键,在弹出的菜单中选择Follow Symbol under Cursor或者下面的Switch between Method Declaration/Definition。

这时系统就会自动跳转到函数定义的位置。如下图。



第二,快速查找一个文件里的所有函数。
我们可以点击窗口最上面的下拉框,这里会显示本文件中所有函数的列表。


第三,利用查找功能。
1.我们先将鼠标定位到一个函数名上。

2.然后选择Edit->Find/Replace->Find Dialog。


3.这时会出现一个查找对话框,可以看到要查找的函数名已经写在里面了。

4.当我们按下Search按钮后,会在查找结果窗口显示查找到的结果。

5.我们点击第二个文件。会发现在这个文件中有两处关键字是高亮显示。

6.我们双击第二项,就会自动跳转到函数的定义处。

文章讲到这里,我们已经很详细地说明了怎样去使用一个类里面没有用过的方法函数;也说明了Qt Creator中的一些便捷操作。可以看到,Qt Creator开发环境,有很多很人性化的设计,我们应该熟练应用它们。
      在以后的文章中,我们不会再很详细地去用帮助来说明一个函数是怎么来的,该怎么用,这些应该自己试着去查找。
欢迎访问我们的网站:www.yafeilinux.com
快速回复
限100 字节
 
上一个 下一个