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