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

来源:互联网 发布:黑帮之地mac 编辑:程序博客网 时间:2024/04/27 21:16

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_OBJECTpublic: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、效果图



0 0
原创粉丝点击