功能:
给定默认路径,按起止日期搜索默认路径下包含起止时间之间的所有文件并按功能显示。
具体代码在下面链接。
功能模块:
(1)默认地址添加
1.在输入框输入地址,按“添加”按钮,将默认地址添加到“搜索地址”列表中。
void SearchUI::on_pushButton_AddDefaultPath_clicked() { QString inputpath = ui -> lineEdit_inputPath ->text(); if(inputpath.isEmpty()) { QMessageBox::information(this, tr("Warning"), tr("默认路径不能为空!"), QMessageBox::Ok); }else { ui-> listWidget_SearchPath ->addItem(inputpath); } }
2.双击列表中地址可以进行修改。
void SearchUI::on_listWidget_SearchPath_itemDoubleClicked(QListWidgetItem *item) { item->setFlags(item->flags() | Qt::ItemIsEditable); }
3.单击列表地址,按“删除”按钮可以进行删除。
//删除路径信息 void SearchUI::on_pushButton_delDefaultPath_clicked() { if(ui->listWidget_SearchPath -> currentItem()!=Q_NULLPTR) { QListWidgetItem *item = ui ->listWidget_SearchPath -> takeItem(ui -> listWidget_SearchPath -> currentRow()); delete item; } }
(2)设置起止时间
(3)此时点击搜索,将搜索任务交给工作线程。
UI线程与工作线程用信号与槽进行通信,参数传递。
界面线程信号:
signals: void sendData(QDateTime, QDateTime, QStringList, QString);//传递时间信息
界面线程槽:
private slots: void labelShowObjectPath(QStringList);//接收并显示路径信息 void labelShowPath(QString);//进度显示
工作线程信号:
signals: void returnPath(QStringList);//信号返回路径信息 void returnProgress(QString);//返回进度条数值
工作线程槽:
private slots: void receiveData(QDateTime ,QDateTime , QStringList, QString);//槽接收时间信息
在界面“搜索”按钮下进行connect连接:
connect(mythread, SIGNAL(returnPath(QStringList)), this, SLOT(labelShowObjectPath(QStringList)), Qt::QueuedConnection); connect(this, SIGNAL(sendData(QDateTime, QDateTime, QStringList, QString)), mythread, SLOT(receiveData(QDateTime, QDateTime, QStringList, QString)), Qt::QueuedConnection); connect(mythread, SIGNAL(returnProgress(QString)), this, SLOT(labelShowPath(QString)), Qt::QueuedConnection);
(4)工作线程接收参数进行搜索
1.利用全局变量存储数据(起止时间,默认路径列表,关键词)
void FileSearchThread::receiveData(QDateTime oldtime, QDateTime newtime, QStringList default_path, QString keyword) { timestart = oldtime; timeend = newtime; default_path_list = default_path; key_word = keyword; //qDebug() << "date: " << str1; }
2.工作线程run函数
启动线程,while循环获取参数信息,获取到之后线程中止。
先利用起止时间的日期部分对默认路径下文件进行搜索,提取出满足条件的日期文件(searchDateFile()函数),并存入QStringList object_date_list列表中。
while(1) { QDate timestart_date = timestart.date(); QDate timesend_date = timeend.date(); //获取满足条件的日期列表 if (timestart_date.toString() != "") { //qDebug() << "time not empty!" ; //qDebug()<<"fff2: " << str1 << str1.size(); for(int i = 0; i < default_path_list.size(); i++) { searchDateFile(timestart_date, timesend_date, default_path_list.at(i)); //qDebug() << "datelistqqq: "<<datelist; } break; } }
再利用日期列表进行时间循环,找到满足条件的路径。
这里分为几种情况:1.起止日期相同:直接进行时间判断
2.起止日期不同:对开始日期的时间判断
对结束日期的时间判断
中间日期直接输出
searchObjectPath()函数搜索目的路径
//遍历日期列表,找出目的路径 for(int i = 0; i < object_date_list.size(); i++) { QString search_date_path = static_cast <QString> (object_date_list.at(i)); //qDebug() <<"search_date_path: "<< search_date_path; //起止日期相同 if (timestart.date() == timeend.date()) { QTime time_start = timestart.time(); QTime time_end = timeend.time(); //qDebug() << time_start << time_end; while(time_start <= time_end) { QString search_time_path = search_date_path + time_start.toString("/HH-mm-ss"); //qDebug() << search_time_path; searchObjectPath(search_time_path); time_start = time_start.addSecs(1); } } else { //判断开始日期下的时间文件 if(search_date_path.indexOf( timestart.date().toString("yyyy-MM-dd")) != -1) { QTime time_start = timestart.time(); QTime time_temp(0,0,0); //qDebug() << time_start << time_temp; if(time_start == time_temp) { QString search_time_path = search_date_path + time_start.toString("/HH-mm-ss"); searchObjectPath(search_time_path); time_start = time_start.addSecs(1); while(time_start != time_temp) { QString search_time_path = search_date_path + time_start.toString("/HH-mm-ss"); //qDebug() <<"search_time_path: "<< search_time_path; searchObjectPath(search_time_path); time_start = time_start.addSecs(1); } } else { while(time_start != time_temp) { QString search_time_path = search_date_path + time_start.toString("/HH-mm-ss"); //qDebug() <<"search_time_path: "<< search_time_path; searchObjectPath(search_time_path); time_start = time_start.addSecs(1); } } } //判断结束日期下的时间文件 else if(search_date_path.indexOf( timeend.date().toString("yyyy-MM-dd")) != -1) { QTime time_end = timeend.time(); qDebug() << "ttttt" <<time_end; QTime time_temp(0,0,0); while(time_temp <= time_end) { QString search_time_path = search_date_path + time_temp.toString("/HH-mm-ss"); //qDebug() << file2; searchObjectPath(search_time_path); time_temp = time_temp.addSecs(1); } }else//中间日期直接判断 { //qDebug() << file; searchObjectPath(search_date_path); } } }
日期搜索函数:
//日期搜索 void FileSearchThread::searchDateFile(QDate date_start, QDate ddate_end2, QString default_path) { while(date_start <= ddate_end2) { QString path_temp = default_path; path_temp += date_start.toString("/yyyy-MM-dd"); QDir dir(path_temp); if (dir.exists()) { object_date_list.append(path_temp); //qDebug() << "t1: "<<object_date_list; } date_start = date_start.addDays(1); } }
目的路径搜索函数(关键词):
//目标路径搜索 int FileSearchThread::searchObjectPath(QString find_file_path) { QString path_temp = ""; QDir dir(find_file_path); if (!dir.exists()) { return 0; } QStringList listFliter = QStringList() ;//<< "*.png" << "*.jpg" << "*.bmp"; QFileInfoList fileList = dir.entryInfoList(listFliter); for(int i = 0; i < fileList.size(); i++) { QFileInfo info = fileList.at(i); if(info.isDir()) { //getFile(info.filePath()); } if(info.isFile()) { path_temp = info.absoluteFilePath(); //qDebug() << str3; //object_path_list.append(path_temp); if (key_word != "") { if(path_temp.indexOf(key_word) != -1) { object_path_list.append(path_temp); emit returnProgress(path_temp); //sleep(1); } } else { object_path_list.append(path_temp); emit returnProgress(path_temp); //sleep(1); } //emit returnProgress(path_temp); } else { if(info.fileName() == "." || info.fileName() == "..") continue; //qDebug() << "path2: " << info.absoluteFilePath(); searchObjectPath(info.absoluteFilePath()); } } return 0; }
(5)界面接收工作线程返回的目的路径进行显示
//接收路径信息并打印到结果列表中 void SearchUI::labelShowObjectPath(QStringList objectpathlist) { object_path_list = objectpathlist; //qDebug() << mylist; //列表显示 if(object_path_list.empty()) { QMessageBox::information(this, tr("Warning"), tr("路径下没有文件!"), QMessageBox::Ok); }else { for(int i = 0; i < object_path_list.size(); i++) { QString string = static_cast <QString> (object_path_list.at(i)); QStandardItem *item = new QStandardItem(string); standarditemModel -> appendRow(item); } } ui->listView_SearchResult -> setModel(standarditemModel); ui -> pushButton_Search -> setEnabled(true); }
(6)界面其他功能
1.搜索结果列表中:
单击修改3个显示按钮信息:
//单击结果列表显示按钮 void SearchUI::on_listView_SearchResult_clicked(const QModelIndex &index) { ui -> pushButton_FileShow -> setEnabled(true); ui -> pushButton_SoftShow -> setEnabled(true); ui -> pushButton_SsysShow -> setEnabled(true); show_path = index.data().toString(); ui ->label_TempPath -> setText(show_path); }
选择打开方式:系统打开,软件打开(仅支持图片),打开文件所在文件夹
//系统显示图片 void SearchUI::on_pushButton_SsysShow_clicked() { ui -> pushButton_SsysShow -> setEnabled(false); LPCWSTR s = LPCWSTR(show_path.utf16()); ShellExecute(NULL, (LPCWSTR)L"open", s, (LPCWSTR)L"", (LPCWSTR)L"", SW_SHOWNORMAL); } //软件显示图片 void SearchUI::on_pushButton_SoftShow_clicked() { ui -> pushButton_SoftShow -> setEnabled(false); QPixmap pixmap(show_path); pixmap.scaled(ui -> label_PhotoShow ->size(), Qt::KeepAspectRatio); ui -> label_PhotoShow -> setScaledContents(true); ui -> label_PhotoShow -> setPixmap(pixmap); ui -> label_PhotoShow -> show(); } //显示图片所在文件夹 void SearchUI::on_pushButton_FileShow_clicked() { ui -> pushButton_FileShow -> setEnabled(false); int n_temp = 0; for(int k = 0; k < show_path.size(); k++) { if(show_path.at(k) == "/") { n_temp = k; } } //qDebug() <<pStr.left(n); QDesktopServices::openUrl(QUrl(show_path.left(n_temp),QUrl::TolerantMode)); }
软件还会显示工作线程当前正在搜索的路径信息并打印在软件上,用作进度提示,当文件数据较少时,显示不明显。
//进度显示 void SearchUI::labelShowPath(QString temp_path) { //qDebug() << "t: " <<temp_path; ui ->label_TempPath -> setText(temp_path); }