热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux下用QT实现文件查找,第7篇实现Qt文本查找功能

第7篇实现Qt文本查找功能版权声明该文章原创于Qter开源社区(http:www.qter.org),作者yafeilinux,转载请注明出处ÿ

第7篇 实现Qt文本查找功能

版权声明该文章原创于Qter开源社区( http://www.qter.org ),作者 yafeilinux ,转载请注明出处! 可以到 这里 讨论本文章!

导语

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

环境:Windows 7 + Qt 5.8.0(包含QtCreator 4.2.1)

正文

一、添加查找对话框

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

classQDialog;

注意前置声明所在的位置跟头文件包含的位置相同。

然后在private部分添加对象定义:QLineEdit*findLineEdit;

QDialog*findDlg;

下面再添加一个私有槽声明:privateslots:

voidshowFindText();

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

注意QLineEdit类的头文件以前已经包含过了,所以这次只包含QDialog的头文件。然后在构造函数中进行初始化操作,即添加如下代码:findDlg=newQDialog(this);

findDlg->setWindowTitle(tr("查找"));

findLineEdit=newQLineEdit(findDlg);

QPushButton*btn=newQPushButton(tr("查找下一个"),findDlg);

QVBoxLayout*layout=newQVBoxLayout(findDlg);

layout->addWidget(findLineEdit);

layout->addWidget(btn);

connect(btn,&QPushButton::clicked,this,&MainWindow::showFindText);

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

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

3ded30343035d66b23cb8624f298b7f5.png

二、实现查找功能

下面我们分步完成showFindText()函数。在讲解过程中会介绍一些很实用的功能。

1.先在函数中添加一行代码来获取行编辑器中要查找的字符串。voidMainWindow::showFindText()

{

QStringstr=findLineEdit->text();

}

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

2cecc74c485e2e799e45bbd95e09e65e.png

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

5350159b2caa578af0f87239948578ec.png

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

f98c24659b35e9f59b6b5c64c7136b31.png

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

1cc59255acd4b286a853eb5137dcbf48.png

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

7b0612b24e3a811c0554ff30521fea5f.png

7.从字面意思上可以知道该函数应该是用于查找功能的,它有两种重载形式,我们单击第一个find函数进入到它的详细介绍处。如下图所示。

61cca3bf2bfad1ea3d24980f11bc683e.png

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

a9483722f0e01d980da09f3dca7b3a5e.png

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

9.根据帮助,我们补充完该行代码:ui->textEdit->find(str,QTextDocument::FindBackward);这时已经能实现查找的功能了。但是刚才看到find的返回值类型是bool型,而且,我们也应该为查找不到字符串作出提示。将这行代码更改为:if(!ui->textEdit->find(str,QTextDocument::FindBackward))

{

QMessageBox::warning(this,tr("查找"),

tr("找不到%1").arg(str));

}

这里的%1作为占位符,在显示时会被arg()中的参数替换掉,这是一种常用的在字符串中添加变量值的方式。现在查找函数的功能就基本实现了。我们会发现随着程序功能的增强,其中的函数也会越来越多,大家都会为查找某个函数的定义位置感到头疼。而在QtCreator中有几种快速定位函数的方法。

第一种,在函数声明的地方直接跳转到函数定义的地方。

例如我们在mainwindow.h文件的loadFile()函数上右击,在弹出的菜单上选择“Switch Between Function Declaration/Definition”,这时就会自动跳转到mainwindow.cpp文件中该函数的定义处。如下图所示。当然还可以反向使用。

ba2d9e6995dfee29858d32711fae5930.png

第二种,快速查看一个文件里的所有函数。

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

82e8c9c3e2f3a7ca27e5279af19497c9.png

第三种,使用类视图或者大纲视图。

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

d12038f924236da8997422d83ba46534.png

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

594dfe0c96df0a7093fe8ab27d3a2098.png

第五种,使用定位器。

有的同学可能早就发现QtCreator左下方的搜索栏了,就是上面写着“Type to locate”的搜索栏,其实我们可以把它叫做定位器,因为使用它可以很方便地定位到一个文件、帮助文档或者函数等等你需要快速定位的内容。我们按下快捷键Ctrl+K,这时会显示出多个过滤器介绍及其功能前缀,如下图所示。

f7210919ea27ff82aa9983b0fd5c07e8.png

使用定位器的格式就是“过滤器前缀+空格+要定位的内容”,比如这里定位当前打开文档中的closeEvent函数,那么可以输入“m closeE”来定位,如下图所示。

997a76de511f60c5527d1d8ced13b4a2.png

12.最后,我们来实现界面上的查找功能。从设计模式进入查找动作的触发信号的槽,更改如下:voidMainWindow::on_action_Find_triggered()

{

findDlg->show();

}

这时运行程序,效果如下图所示。

01cb05370bf2676c0388e03f46bbd821.png

结语

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



推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 服务器上的操作系统有哪些,如何选择适合的操作系统?
    本文介绍了服务器上常见的操作系统,包括系统盘镜像、数据盘镜像和整机镜像的数量。同时,还介绍了共享镜像的限制和使用方法。此外,还提供了关于华为云服务的帮助中心,其中包括产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题和视频帮助等技术文档。对于裸金属服务器的远程登录,本文介绍了使用密钥对登录的方法,并提供了部分操作系统配置示例。最后,还提到了SUSE云耀云服务器的特点和快速搭建方法。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文介绍了一种解决PyQt界面在高分辨率下字体显示不完全的方法。通过设置High_DPI属性或应用自适应字体,可以解决在更高分辨率电脑上字体被控件遮挡的问题。同时,还提供了判断Qt版本和设置字体大小的代码示例。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 本文介绍了在Windows系统下,下载并解压lua5.3后得到的四个文件:lua53.dll, lua53.exe, luac53.exe和wlua53.exe的功能。其中,前三个文件的作用已知,但对于wlua53.exe的具体用法,作者通过查阅资料得出该文件与图形界面的窗口相关,但未找到相关说明。因此,作者希望能够请教关于wlua53.exe的具体用法。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • Window10+anaconda+python3.5.4+ tensorflow1.5+ keras(GPU版本)安装教程 ... [详细]
author-avatar
手机用户2602918007
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有