QT实现文件查找显示列表功能

1、UI设计,存储结果为FindFileForm.ui


2、编译ui文件生成辅助ui头文件ui_FindFileForm.h

3、实现对话框界面逻辑,FindForm类

#ifndef FIND_FILE_FORM_H
#define  FIND_FILE_FORM_H
#pragma once
#include "ui_FindFileForm.h"

class FindFileForm:public QWidget
{
	Q_OBJECT
	public:
		FindFileForm(QWidget* parent = 0);
	protected slots:
		void OnSearch();
		void OnBrowse();
		void OnStop();
		void OnClose();
		void OnTextChanged(const QString &);
	private:
		void ExecuteSearch(const QDir& dir,const QString& name,const QString& content);
		QStringList FindFiles(const QDir& dir,const QString& name,const QString& content);
		void ShowFiles(const QDir& dir,const QStringList& files);
	private:
		Ui_FindFileForm m_UIForm;
		bool m_Stoped;
		int m_nCOunt;
};
#endif //end of FIND_FILE_FORM_H

#include "stdafx.h"
#include "findfileform.h"

FindFileForm::FindFileForm(QWidget* parent):QWidget(parent)
{
	m_UIForm.setupUi(this);
	m_UIForm.m_StatusLabel->setText(tr("就绪"));
	m_UIForm.m_ResultLabel->setText(tr("找到0个文件"));

	m_UIForm.m_NameComboBox->setEditText(tr("*"));
	m_UIForm.m_NameComboBox->addItem(tr("*"));
	m_UIForm.m_DirComboBox->setEditText(QDir::currentPath());
	m_UIForm.m_DirComboBox->addItem(QDir::currentPath());
	m_UIForm.m_SensitiveCheckBox->setEnabled(false);
	m_UIForm.m_StopPushButton->setEnabled(false);

	connect(m_UIForm.m_StopPushButton,SIGNAL(clicked()),this,SLOT(OnStop()));
	connect(m_UIForm.m_SearchPushButton,SIGNAL(clicked()),this,SLOT(OnSearch()));
	connect(m_UIForm.m_BrowsePushButton,SIGNAL(clicked()),this,SLOT(OnBrowse()));
	connect(m_UIForm.m_ClosePushButton,SIGNAL(clicked()),this,SLOT(OnClose()));
	connect(m_UIForm.m_TxtlineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(OnTextChanged(const QString &)));

	setLayout(m_UIForm.m_MainVerticalLayout);
	resize(500,500);

	m_Stoped = false;
}

void FindFileForm::OnSearch()
{
	m_Stoped = false;
	m_nCOunt = 0;
	bool bCaseSensetive = m_UIForm.m_SensitiveCheckBox->isChecked();
	bool bSubfolder = m_UIForm.m_SubfilderCheckBox->isChecked();
	QString dir = m_UIForm.m_DirComboBox->currentText();
	QString content = m_UIForm.m_TxtlineEdit->text();
	QString name = m_UIForm.m_NameComboBox->currentText();
		
	m_UIForm.frame->setEnabled(false);

	m_UIForm.m_SearchPushButton->setEnabled(false);
	m_UIForm.m_StopPushButton->setEnabled(true);
	m_UIForm.m_ResultTableWidget->setRowCount(0);

	ExecuteSearch(QDir(dir),name,content);

	if(m_Stoped)
	{
		m_UIForm.m_StatusLabel->setText(tr("中止"));
	}
	else
	{
		m_UIForm.m_StatusLabel->setText(tr("就绪"));
	}

	m_UIForm.frame->setEnabled(true);

	m_UIForm.m_SearchPushButton->setEnabled(true);
	m_UIForm.m_StopPushButton->setEnabled(false);
	
}
void FindFileForm::OnBrowse()
{
	QString dir =  QFileDialog::getExistingDirectory(this,tr("浏览文件目录"),QDir::currentPath());
	m_UIForm.m_DirComboBox->addItem(dir);
	m_UIForm.m_DirComboBox->setCurrentIndex(m_UIForm.m_DirComboBox->currentIndex()+1);
	
}
void FindFileForm::OnStop()
{
	m_Stoped = true;
}
void FindFileForm::OnClose()
{
	QWidget::close();
}
void FindFileForm::OnTextChanged(const QString & content)
{
	if(content.isEmpty())
	{
		m_UIForm.m_SensitiveCheckBox->setEnabled(false);
	}
	else
	{
		m_UIForm.m_SensitiveCheckBox->setEnabled(true);
	}
}

void FindFileForm::ExecuteSearch(const QDir& dir,const QString& name,const QString& content)
{
	
	if(m_UIForm.m_SubfilderCheckBox->isChecked())
	{
		QStringList folders = dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot);
		for (int i = 0 ; i < folders.size(); i++)
		{
			qApp->processEvents();
			if(m_Stoped)
			{
				break;
			}
			QString strDir = QString(tr("%1/%2")).arg(dir.absolutePath()).arg(folders[i]);
			ExecuteSearch(strDir,name,content);
		}
	}
	
	QStringList files = FindFiles(dir,name,content);
	ShowFiles(dir,files);
	m_nCOunt += files.size();
	m_UIForm.m_ResultLabel->setText(tr("找到%1个文件").arg(m_nCOunt));
}

QStringList FindFileForm::FindFiles(const QDir& dir,const QString& name,const QString& content)
{
	QStringList files = dir.entryList(QStringList(name),QDir::Files|QDir::NoSymLinks);
	if(content.isEmpty())
		return files;

	Qt::CaseSensitivity sensitive = m_UIForm.m_SensitiveCheckBox->isChecked()?Qt::CaseSensitive:Qt::CaseInsensitive;

	QStringList findFiles;
	for (int i = 0 ; i < files.size() ; i++)
	{
		qApp->processEvents();
		if (m_Stoped)
		{
			break;
		}
		QFile file(dir.absoluteFilePath(files[i]));
		if (file.open(QIODevice::ReadOnly))
		{
			QString line;
			QTextStream instream(&file);
			while(!instream.atEnd())
			{
				 if (m_Stoped)
				 {
					 break;
				 }

				 line = instream.readLine();
				 if (line.contains(content,sensitive))
				 {
					findFiles<<files[i];
					break;
				 }
			}
		}
	}

	return findFiles;
}

void FindFileForm::ShowFiles(const QDir& dir,const QStringList& files)
{
	for(int i = 0 ; i < files.size();i++)
	{
		QFile file(dir.absoluteFilePath(files[i]));
		QFileInfo fileInfo(file);
		QString name = fileInfo.fileName();
		qint64 sizes = fileInfo.size();
		QString time =  fileInfo.lastModified().toString(tr("yyyy年yy月yy日"));
		QString permit = fileInfo.isWritable()?tr("可写"):tr("可读");
		QTableWidgetItem* pNameItem = new QTableWidgetItem(name);
		QTableWidgetItem* pPermitItem = new QTableWidgetItem(permit);
		QTableWidgetItem* pTimeItem = new QTableWidgetItem(time);
		QTableWidgetItem* pSizeItem = new QTableWidgetItem(tr("%1KB").arg(int(sizes+1023)/1024));

		int rowcount = m_UIForm.m_ResultTableWidget->rowCount();
		m_UIForm.m_ResultTableWidget->insertRow(rowcount);
		m_UIForm.m_ResultTableWidget->setItem(rowcount,0,pNameItem);
		m_UIForm.m_ResultTableWidget->setItem(rowcount,1,pSizeItem);
		m_UIForm.m_ResultTableWidget->setItem(rowcount,2,pTimeItem);
		m_UIForm.m_ResultTableWidget->setItem(rowcount,3,pPermitItem);		
	}
}
4、编译  findfileform.h,自动生成moc_findfileform.cpp

5、编写主函数调用

#include "stdafx.h"
#include "findfileform.h"
int main(int argc, char *argv[])
{
	QApplication app(argc, argv);
	QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
	FindFileForm findForm;
	findForm.Show();
	return app.exec();
}
6、效果图



  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值