Qt 文件搜索(写入文本文件)
代码无意间在网上找到,下载回来后改了几个格式,编译后经测试可以正常使用,这个个文件搜索的很好的例子,有两种搜索方式:一种是按文件名作为关键字进行搜索,一种是以文档中所包含的关键字进行搜索,贴两张图先:

上图为两个文本文档(都位于C盘根目录下),其中都包含有"2010-12-05"这样的关键字,一会就用这个关键字搜索看看行不行...

注意:这个实例程序无法进行递归的查找,只能搜索指定目录这一层的文件,另外它只能匹配文本文档。

1 #ifndef WINDOW_H
2 #define WINDOW_H
3
4 #include<QDialog>
5 class QComboBox;
6 class QDir;
7 class QLabel;
8 class QPushButton;
9 class QTableWidget;
10
11 class Window:public QDialog
12 {
13 Q_OBJECT
14 public:
15 Window(QWidget *parent=0);
16 private slots:
17 void browse();
18 void find();
19 private:
20 QStringList findFiles(const QDir &directory,const QStringList &files,
21 const QString &text);
22 void showFiles(const QDir &directory,const QStringList &files);
23 QPushButton *createButton(const QString &text,const char *member);
24 QComboBox *createComboBox(const QString &text = QString());
25 void createFilesTable();
26 QComboBox *fileComboBox;
27 QComboBox *textComboBox;
28 QComboBox *directoryComboBox;
29 QLabel *fileLabel;
30 QLabel *textLabel;
31 QLabel *directoryLabel;
32 QLabel *filesFoundLabel;
33 QPushButton *browseButton;
34 QPushButton *findButton;
35 QTableWidget *filesTable;
36 };
37
38 #endif
39


1 #include <QtGui>
2 #include "window.h"
3 Window::Window(QWidget *parent)
4 : QDialog(parent)
5 {
6 browseButton = createButton(tr("&Browse..."),SLOT(browse()));
7 findButton = createButton(tr("&Find"),SLOT(find()));
8 fileComboBox = createComboBox(tr("*"));
9 textComboBox = createComboBox();
10 directoryComboBox = createComboBox(QDir::currentPath());
11 fileLabel = new QLabel(tr("Named:"));
12 textLabel = new QLabel(tr("Containing text:"));
13 directoryLabel = new QLabel(tr("In directory:"));
14 filesFoundLabel = new QLabel;
15 createFilesTable();
16 QHBoxLayout *buttonsLayout = new QHBoxLayout;
17 buttonsLayout->addStretch();
18 buttonsLayout->addWidget(findButton);
19 QGridLayout *mainLayout = new QGridLayout;
20 mainLayout->addWidget(fileLabel,0,0);
21 mainLayout->addWidget(fileComboBox,0,1,1,2);
22 mainLayout->addWidget(textLabel,1,0);
23 mainLayout->addWidget(textComboBox,1,1,1,2);
24 mainLayout->addWidget(directoryLabel,2,0);
25 mainLayout->addWidget(directoryComboBox,2,1);
26 mainLayout->addWidget(browseButton,2,2);
27 mainLayout->addWidget(filesTable,3,0,1,3);
28 mainLayout->addWidget(filesFoundLabel,4,0);
29 mainLayout->addLayout(buttonsLayout,5,0,1,3);
30 setLayout(mainLayout);
31 setWindowTitle(tr("Find Files"));
32 resize(700,300);
33 }
34 void Window::browse()
35 {
36 QString directory = QFileDialog::getExistingDirectory(this,
37 QObject::tr("Find Files"),QDir::currentPath());
38 if (!directory.isEmpty()) {
39 directoryComboBox->addItem(directory);
40 directoryComboBox->setCurrentIndex(directoryComboBox->currentIndex() + 1);
41 }
42 }
43 void Window::find()
44 {
45 filesTable->setRowCount(0);
46 QString fileName = fileComboBox->currentText();
47 QString text = textComboBox->currentText();
48 QString path = directoryComboBox->currentText();
49 QDir directory = QDir(path);
50 QStringList files;
51 if (fileName.isEmpty()) fileName = "*";
52 files = directory.entryList(QStringList(fileName),
53 QDir::Files | QDir::NoSymLinks);
54 if (!text.isEmpty())
55 files = findFiles(directory,files,text);
56 showFiles(directory,files);
57 }
58 QStringList Window::findFiles(const QDir &directory,const QStringList &files,
59 const QString &text)
60 {
61 QProgressDialog progressDialog(this);
62 progressDialog.setCancelButtonText(tr("&Cancel"));
63 progressDialog.setRange(0,files.size());
64 progressDialog.setWindowTitle(tr("Find Files"));
65 QStringList foundFiles;
66 for (int i = 0; i < files.size(); ++i) {
67 progressDialog.setValue(i);
68 progressDialog.setLabelText(tr("Searching file number %1 of %2...")
69 .arg(i).arg(files.size()));
70 qApp->processEvents();
71 if (progressDialog.wasCanceled()) break;
72 QFile file(directory.absoluteFilePath(files[i]));
73 if (file.open(QIODevice::ReadOnly)) {
74 QString line;
75 QTextStream in(&file);
76
77 while (!in.atEnd()) {
78 if (progressDialog.wasCanceled()) break;
79 line = in.readLine();
80 if (line.contains(text)) {
81 foundFiles << files[i];
82 break;
83 }
84 }
85 }
86 }
87 return foundFiles;
88 }
89 void Window::showFiles(const QDir &directory,const QStringList &files)
90 {
91 for (int i = 0; i < files.size(); ++i) {
92 QFile file(directory.absoluteFilePath(files[i]));
93 qint64 size = QFileInfo(file).size();
94 QTableWidgetItem *fileNameItem = new QTableWidgetItem(files[i]);
95 fileNameItem->setFlags(Qt::ItemIsEnabled);
96 QTableWidgetItem *sizeItem = new QTableWidgetItem(tr("%1 KB")
97 .arg(int((size + 1023) / 1024)));
98 sizeItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
99 sizeItem->setFlags(Qt::ItemIsEnabled);
100 int row = filesTable->rowCount();
101 filesTable->insertRow(row);
102 filesTable->setItem(row,0,fileNameItem);
103 filesTable->setItem(row,1,sizeItem);
104 }
105 filesFoundLabel->setText(tr("%1 file(s) found").arg(files.size()));
106 }
107 QPushButton *Window::createButton(const QString &text,const char *member)
108 {
109 QPushButton *button = new QPushButton(text);
110 connect(button,SIGNAL(clicked()),this,member);
111 return button;
112 }
113 QComboBox *Window::createComboBox(const QString &text)
114 {
115 QComboBox *comboBox = new QComboBox;
116 comboBox->setEditable(true);
117 comboBox->addItem(text);
118 comboBox->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred);
119 return comboBox;
120 }
121 void Window::createFilesTable()
122 {
123 filesTable = new QTableWidget(0,2);
124 QStringList labels;
125 labels << tr("File Name") << tr("Size");
126 filesTable->setHorizontalHeaderLabels(labels);
127 filesTable->horizontalHeader()->setResizeMode(0,QHeaderView::Stretch);
128 filesTable->verticalHeader()->hide();
129 filesTable->setShowGrid(false);
130 }
131


1 #include "window.h"
2 #include <QApplication>
3
4 int main(int argc,char *argv[])
5 {
6 QApplication app(argc,argv);
7 Window window;
8 window.show();
9 return app.exec();
10 }
11

http://www.cnblogs.com/hicjiajia/archive/2010/12/05/1896823.html
Qt 文件搜索(写入文本文件)的更多相关文章
- Android 建立文件夹、生成文件并写入文本文件内容
一.首先添加权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">& ...
- 项目实战:Qt文件改名工具 v1.2.0(支持递归检索,搜索:模糊匹配,前缀匹配,后缀匹配;重命名:模糊替换,前缀追加,后缀追加)
需求 在整理文件和一些其他头文件的时候,需要对其名称进行整理和修改,此工具很早就应该写了,创业后,非常忙,今天抽空写了一个顺便提供给学习. 工具和源码下载地址 本篇文章的应用包和源码包可在 ...
- Qt 文件处理(readLine可以读取char[],并且有qSetFieldWidth qSetPadChar 等全局函数)
Qt 文件处理 Qt提供了QFile类来进行文件处理,为了更方便地处理文本文件或二进制文件,Qt还提了QTextStream类和QDataStream类,处理临时文件可以使用QTemporaryFil ...
- Android 下载文件及写入SD卡
Android 下载文件及写入SD卡,实例代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...
- python 将字节写入文本文件
想在文本模式打开的文件中写入原始的字节数据 将字节数据直接写入文件的缓冲区即可 >>> import sys >>> sys.stdout.write(b'Hell ...
- C# winfrom 写的一个搜索助手,可以按照标题和内容搜索,支持doc,xls,ppt,pdf,txt等格式的文件搜索
C# winfrom 写的一个搜索助手,可以按照标题和内容搜索,指定目录后,遍历搜索文件和子目,现在只写了支持.DOC.DOCX.XLS.XLSX.PPT.PPTX.PDF.HTML.HTM.TXT等 ...
- C# 实现写入文本文件内容功能
private void write_txt(string str1, string str2, string str3) { System.DateTime currentTime = System ...
- J2SE 8的输入输出--读取/写入文本文件和读取/写入二进制数据
读取/写入文本文件 // 1. 文本输入 // (1) 短小文本直接转入字符串 String string = new String(Files.readAllBytes(Paths.get(&quo ...
- 【MATLAB】读取和写入文本文件
在MATLAB中,来读取和写入文本文件是很简单的事.下面,就来简单介绍下.如果有其他问题,请留言. 一.读取文本文件 思路: 1.用fopen来打开一个文件句柄 2.用fgetl来获得文件中的一行,如 ...
随机推荐
- Windows 8.1 with update 官方最新镜像汇总(全)
Windows 8.1 with update 官方最新镜像汇总,发布日期: 2014/12/16,Microsoft MSDN. 镜像更新日志: 12/29:32位大客户专业版中文版12/24:64 ...
- 《Programming WPF》翻译 第3章 1.什么是控件
原文:<Programming WPF>翻译 第3章 1.什么是控件 对于一个应用程序而言,控件是搭建用户界面的积木.它们具备交互式的特征,例如文本框.按钮以及列表框.尽管如此,WPF还有 ...
- uva 10718 Bit Mask (位运算)
uva 10718 Bit Mask (位运算) Problem A Bit Mask Time Limit 1 Second In bit-wise expression, mask is a ...
- 转:更新Android SDK之后Eclipse提示ADT版本过低的一个简易解决办法
拜GFW所赐,对于初学者的我来说,总会出现一些莫名其妙的问题 首先说明一下发表这一篇博文的“历史原因”吧,因为在更新SDK之后,进入Eclipse设置Android SDK目录的时候,会突然说我的版本 ...
- 福建省队集训被虐记——DAY4
啊啊啊啊啊啊第四天考的是我最不擅长的图论--整个人都斯巴达了 //另外不得不吐槽下午的上课讲的都是网络流--难道是出题人觉得图论里除了网络流以外的其他算法都没有人权图样图森破? 愚蠢的算法(clums ...
- 利用智能手机(Android)追踪一块磁铁(二)
在上一篇博客中提到了利用磁场强度推算传感器位置坐标的公式,下面就介绍怎么利用智能手机完成磁铁的追踪(任何具有磁感应器的装置均可以),这里主要是利用Android手机. 1:程序步骤: 首先将磁铁放置在 ...
- Live555 分析(三):客服端
live555的客服端流程:建立任务计划对象--建立环境对象--处理用户输入的参数(RTSP地址)--创建RTSPClient实例--发出DESCRIBE--发出SETUP--发出PLAY--进入Lo ...
- poj 2385 Apple Catching(dp)
Description It and ) in his field, each full of apples. Bessie cannot reach the apples when they are ...
- 2301: [HAOI2011]Problem b
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4164 Solved: 1888[Submit] ...
- [Regular Expressions] Match the Same String Twice
Regular Expression Backreferences provide us a method to match a previously captured pattern a secon ...