v1.0.2
增加文件删除、打开目录功能
This commit is contained in:
@@ -1,9 +1,20 @@
|
|||||||
# 重复文件检测工具
|
# 重复文件检测工具
|
||||||
|
|
||||||
windeploy目录下的文件可以直接运行
|
windeploy目录下的文件可以直接运行
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## 环境
|
## 环境
|
||||||
- Clion 2022.1.2
|
- Clion 2022.1.2
|
||||||
- qt 5.14.2
|
- qt 5.14.2
|
||||||
|
|
||||||
## 功能
|
## 功能
|
||||||
- 单个文件计算md5
|
- 单个文件计算md5
|
||||||
- 文件夹内重复文件检测
|
- 文件夹内重复文件检测
|
||||||
|
|
||||||
|
## 更新记录
|
||||||
|
### 20220619 v1.0.2
|
||||||
|
- [x] 增加打开文件目录功能
|
||||||
|
- [x] 增加删除文件功能
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 793 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
@@ -1,7 +1,9 @@
|
|||||||
//
|
//
|
||||||
// Created by 12038 on 2022/6/16.
|
// Created by 12038 on 2022/6/16.
|
||||||
//
|
//
|
||||||
|
#include <QProcess>
|
||||||
#include "DuplicateFiles.h"
|
#include "DuplicateFiles.h"
|
||||||
|
#include <QUrl>
|
||||||
|
|
||||||
DuplicateFiles::DuplicateFiles(QObject *) {
|
DuplicateFiles::DuplicateFiles(QObject *) {
|
||||||
|
|
||||||
@@ -73,3 +75,24 @@ QStringList DuplicateFiles::getFiles(const QString &filesDirPath) {
|
|||||||
return files;
|
return files;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DuplicateFiles::getTextSlot(const QString &text) {
|
||||||
|
qDebug()<<"widget_2当前的text为:"<< text;
|
||||||
|
currentText = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DuplicateFiles::openDirSlot() {
|
||||||
|
QFileInfo fileInfo(currentText);
|
||||||
|
QString filePath = fileInfo.absolutePath();
|
||||||
|
qDebug()<<"filePath"<<filePath;
|
||||||
|
QString path = filePath.replace("/", "\\");
|
||||||
|
qDebug()<<"path"<<path;
|
||||||
|
QProcess::startDetached("explorer " + path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DuplicateFiles::delActionTriggeredSlot() {
|
||||||
|
QFile file(currentText);
|
||||||
|
qDebug()<<"即将删除:"<<currentText;
|
||||||
|
emit delActionFeedbackSignal(file.remove());
|
||||||
|
qDebug()<<"删除成功";
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,16 +24,22 @@ signals:
|
|||||||
void filesSignal(const QStringList &);
|
void filesSignal(const QStringList &);
|
||||||
void process(const int &, const int &);
|
void process(const int &, const int &);
|
||||||
void duplicateFilesSignal(const QHash<QByteArray, QStringList> &);
|
void duplicateFilesSignal(const QHash<QByteArray, QStringList> &);
|
||||||
|
void delActionFeedbackSignal(bool delFlag);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void getFilesSlot(const QString & filesDirPath);
|
void getFilesSlot(const QString & filesDirPath);
|
||||||
void calMd5Slot(const QString &filePath);
|
void calMd5Slot(const QString &filePath);
|
||||||
|
void getTextSlot(const QString &);
|
||||||
|
void openDirSlot();
|
||||||
|
void delActionTriggeredSlot();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QByteArray calMd5(const QString &filePath);
|
QByteArray calMd5(const QString &filePath);
|
||||||
QStringList getFiles(const QString &);
|
QStringList getFiles(const QString &);
|
||||||
QHash<QByteArray, QStringList> duplicateFiles;
|
QHash<QByteArray, QStringList> duplicateFiles;
|
||||||
|
|
||||||
|
QString currentText = "";
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
// You may need to build the project (run Qt uic code generator) to get "ui_Widget.h" resolved
|
// You may need to build the project (run Qt uic code generator) to get "ui_Widget.h" resolved
|
||||||
|
|
||||||
|
#include <QProcess>
|
||||||
#include "widget.h"
|
#include "widget.h"
|
||||||
#include "ui_widget.h"
|
#include "ui_widget.h"
|
||||||
|
|
||||||
@@ -61,6 +62,24 @@ Widget::Widget(QWidget *parent)
|
|||||||
this, SLOT(duplicateFilesSlot(const QHash<QByteArray, QStringList> &)));
|
this, SLOT(duplicateFilesSlot(const QHash<QByteArray, QStringList> &)));
|
||||||
connect(ui->listWidget, SIGNAL(currentTextChanged(const QString &)),
|
connect(ui->listWidget, SIGNAL(currentTextChanged(const QString &)),
|
||||||
this, SLOT(currentTextChangedSlot(const QString &)));
|
this, SLOT(currentTextChangedSlot(const QString &)));
|
||||||
|
|
||||||
|
connect(ui->listWidget_2, SIGNAL(customContextMenuRequested(const QPoint &)),
|
||||||
|
this, SLOT(on_listWidget_customContextMenuRequested(const QPoint &)));
|
||||||
|
ui->listWidget_2->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
|
||||||
|
delAction = new QAction();
|
||||||
|
delAction->setText("删除文件");
|
||||||
|
openAction = new QAction();
|
||||||
|
openAction->setText("打开文件目录");
|
||||||
|
|
||||||
|
connect(delAction, SIGNAL(triggered(bool)),
|
||||||
|
duplicateFiles, SLOT(delActionTriggeredSlot()));
|
||||||
|
connect(ui->listWidget_2, SIGNAL(currentTextChanged(const QString &)),
|
||||||
|
duplicateFiles, SLOT(getTextSlot(const QString &)));
|
||||||
|
connect(openAction, SIGNAL(triggered(bool)),
|
||||||
|
duplicateFiles, SLOT(openDirSlot()));
|
||||||
|
connect(duplicateFiles, SIGNAL(delActionFeedbackSignal(bool)),
|
||||||
|
this, SLOT(delActionFeedbackSlot(bool)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget::~Widget()
|
Widget::~Widget()
|
||||||
@@ -68,6 +87,7 @@ Widget::~Widget()
|
|||||||
duplicateFiles->deleteLater();
|
duplicateFiles->deleteLater();
|
||||||
myThread->exit();
|
myThread->exit();
|
||||||
myThread->wait(10 * 1000);
|
myThread->wait(10 * 1000);
|
||||||
|
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,4 +195,36 @@ void Widget::currentTextChangedSlot(const QString ¤tText) {
|
|||||||
ui->listWidget_2->addItems(this->duplicateResults[currentText.toLocal8Bit()]);
|
ui->listWidget_2->addItems(this->duplicateResults[currentText.toLocal8Bit()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Widget::on_listWidget_customContextMenuRequested(const QPoint &pos)
|
||||||
|
{
|
||||||
|
// ui->listWidget_2->currentTextChanged()
|
||||||
|
QMenu *menu = new QMenu(this);
|
||||||
|
// menu->addAction(ui->actionAdd);
|
||||||
|
// menu->addAction(ui->actionClear);
|
||||||
|
// menu->addAction(ui->actionDelete);
|
||||||
|
// menu->addAction(ui->actionInsert);
|
||||||
|
menu->addAction(this->delAction);
|
||||||
|
menu->addAction(this->openAction);
|
||||||
|
menu->addSeparator();
|
||||||
|
|
||||||
|
// menu->addAction(ui->actionInit);
|
||||||
|
// menu->addSeparator();
|
||||||
|
// menu->addAction(ui->actionSelAll);
|
||||||
|
// menu->addAction(ui->actionSelInv);
|
||||||
|
// menu->addAction(ui->actionSelNone);
|
||||||
|
// menu->addAction(ui->actionSelPopMenu);
|
||||||
|
menu->exec(QCursor::pos());
|
||||||
|
delete menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Widget::delActionFeedbackSlot(bool flag) {
|
||||||
|
if(flag){
|
||||||
|
qDebug()<<"remove item";
|
||||||
|
QListWidgetItem * item = ui->listWidget_2->currentItem();
|
||||||
|
qDebug()<<item;
|
||||||
|
ui->listWidget_2->removeItemWidget(item);
|
||||||
|
delete item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QFileDialog>
|
#include <QFileDialog>
|
||||||
|
#include <QMenu>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
namespace Ui { class Widget; }
|
namespace Ui { class Widget; }
|
||||||
@@ -45,6 +46,7 @@ public slots:
|
|||||||
void processSlot(const int &, const int &);
|
void processSlot(const int &, const int &);
|
||||||
void duplicateFilesSlot(const QHash<QByteArray, QStringList> &);
|
void duplicateFilesSlot(const QHash<QByteArray, QStringList> &);
|
||||||
void currentTextChangedSlot(const QString &);
|
void currentTextChangedSlot(const QString &);
|
||||||
|
void delActionFeedbackSlot(bool flag);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void btnMaxClickedSlot();
|
void btnMaxClickedSlot();
|
||||||
@@ -53,6 +55,8 @@ private slots:
|
|||||||
void calMd5ofFileSlot();
|
void calMd5ofFileSlot();
|
||||||
void selectDirSlot();
|
void selectDirSlot();
|
||||||
|
|
||||||
|
void on_listWidget_customContextMenuRequested(const QPoint &pos);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::Widget *ui;
|
Ui::Widget *ui;
|
||||||
DuplicateFiles * duplicateFiles;
|
DuplicateFiles * duplicateFiles;
|
||||||
@@ -61,6 +65,9 @@ private:
|
|||||||
QPoint mousePosInWindow = QPoint();
|
QPoint mousePosInWindow = QPoint();
|
||||||
QHash<QByteArray, QStringList> duplicateResults;
|
QHash<QByteArray, QStringList> duplicateResults;
|
||||||
|
|
||||||
|
QAction *delAction;
|
||||||
|
QAction *openAction;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -386,7 +386,11 @@
|
|||||||
<widget class="QListWidget" name="listWidget"/>
|
<widget class="QListWidget" name="listWidget"/>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QListWidget" name="listWidget_2"/>
|
<widget class="QListWidget" name="listWidget_2">
|
||||||
|
<property name="contextMenuPolicy">
|
||||||
|
<enum>Qt::CustomContextMenu</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
Reference in New Issue
Block a user