@ -0,0 +1,4 @@ |
|||
/cmake-build-debug/ |
|||
/cmake-build-release/ |
|||
/.idea/ |
|||
/windeploy/ |
@ -0,0 +1,70 @@ |
|||
cmake_minimum_required(VERSION 3.22) |
|||
project(FileRename) |
|||
|
|||
set(CMAKE_CXX_STANDARD 14) |
|||
set(CMAKE_AUTOMOC ON) |
|||
set(CMAKE_AUTORCC ON) |
|||
set(CMAKE_AUTOUIC ON) |
|||
|
|||
set(CMAKE_PREFIX_PATH "C:/Qt/Qt5.14.2/5.14.2/mingw73_64") |
|||
|
|||
aux_source_directory(${PROJECT_SOURCE_DIR} DIR_MAIN_SRCS) |
|||
aux_source_directory(${PROJECT_SOURCE_DIR}/resources DIR_RESOURCES_SRCS) |
|||
aux_source_directory(${PROJECT_SOURCE_DIR}/src DIR_SRC_SRCS) |
|||
|
|||
find_package(Qt5 COMPONENTS |
|||
Core |
|||
Gui |
|||
Widgets |
|||
REQUIRED) |
|||
|
|||
# 添加qrc资源 |
|||
qt5_add_resources(QRC_FILES resources/img.qrc) |
|||
|
|||
#include_directories(resources |
|||
# src) |
|||
|
|||
IF (CMAKE_BUILD_TYPE STREQUAL Debug) |
|||
add_executable(${PROJECT_NAME} |
|||
resources/app_win32.rc |
|||
${DIR_MAIN_SRCS} ${DIR_RESOURCES_SRCS} ${DIR_SRC_SRCS} ${QRC_FILES}) |
|||
else(CMAKE_BUILD_TYPE STREQUAL Release) |
|||
add_executable(${PROJECT_NAME} |
|||
WIN32 resources/app_win32.rc |
|||
${DIR_MAIN_SRCS} ${DIR_RESOURCES_SRCS} ${DIR_SRC_SRCS} ${QRC_FILES}) |
|||
ENDIF() |
|||
|
|||
target_link_libraries(${PROJECT_NAME} |
|||
Qt5::Core |
|||
Qt5::Gui |
|||
Qt5::Widgets |
|||
) |
|||
|
|||
if (WIN32) |
|||
set(DEBUG_SUFFIX) |
|||
if (MSVC AND CMAKE_BUILD_TYPE MATCHES "Debug") |
|||
set(DEBUG_SUFFIX "d") |
|||
endif () |
|||
set(QT_INSTALL_PATH "${CMAKE_PREFIX_PATH}") |
|||
if (NOT EXISTS "${QT_INSTALL_PATH}/bin") |
|||
set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..") |
|||
if (NOT EXISTS "${QT_INSTALL_PATH}/bin") |
|||
set(QT_INSTALL_PATH "${QT_INSTALL_PATH}/..") |
|||
endif () |
|||
endif () |
|||
if (EXISTS "${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll") |
|||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD |
|||
COMMAND ${CMAKE_COMMAND} -E make_directory |
|||
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/") |
|||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD |
|||
COMMAND ${CMAKE_COMMAND} -E copy |
|||
"${QT_INSTALL_PATH}/plugins/platforms/qwindows${DEBUG_SUFFIX}.dll" |
|||
"$<TARGET_FILE_DIR:${PROJECT_NAME}>/plugins/platforms/") |
|||
endif () |
|||
foreach (QT_LIB Core Gui Widgets) |
|||
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD |
|||
COMMAND ${CMAKE_COMMAND} -E copy |
|||
"${QT_INSTALL_PATH}/bin/Qt5${QT_LIB}${DEBUG_SUFFIX}.dll" |
|||
"$<TARGET_FILE_DIR:${PROJECT_NAME}>") |
|||
endforeach (QT_LIB) |
|||
endif () |
@ -0,0 +1,52 @@ |
|||
# 文件重命名工具 |
|||
![](./assets/img.png) |
|||
## 环境 |
|||
- Clion 2022.1.2 |
|||
- qt 5.14.2 |
|||
|
|||
## 功能 |
|||
- 单个文件重命名 |
|||
- 文件夹多个文件重命名 |
|||
|
|||
## 模式 |
|||
### 替换模式 |
|||
> 将文件名中的旧字符串替换为新字符串 |
|||
|
|||
旧字符串为空时,将文件名设置为新字符串 |
|||
|
|||
新字符串不能存在为:/\<>?*| |
|||
|
|||
新字符串不能为空 |
|||
|
|||
### 时间戳模式 |
|||
|
|||
> 将文件名中的UTC时间戳替换为北京时间:年月日时分秒 |
|||
|
|||
旧文件名用“-”连接,为:前段名-UTC时间戳.后缀 格式 |
|||
|
|||
程序会将UTC时间戳替换为北京时间年月日时分秒格式 |
|||
|
|||
新名:前段名-北京时间.后缀 |
|||
|
|||
## 重复文件处理 |
|||
当前文件夹有重复文件时,在新名后加“-旧名”字符串 |
|||
|
|||
## 使用 |
|||
deploy目录下为生成的程序,可以直接使用 |
|||
### 替换模式 |
|||
- 输入新旧字符串,选择替换模式,点击确认 |
|||
- 选择文件或者文件夹 |
|||
![](./assets/img_2.png) |
|||
|
|||
### 时间戳模式 |
|||
- 选择时间戳模式,点击确认 |
|||
- 选择文件或者文件夹 |
|||
|
|||
![](./assets/img_1.png) |
|||
|
|||
## 更改日志 |
|||
### 20220620 v1.0.2 |
|||
- [x] 新增打开文件目录功能(右下角listwidget支持) |
|||
- [x] 新增删除文件功能(右下角listwidget支持) |
|||
|
|||
|
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 38 KiB |
@ -0,0 +1 @@ |
|||
IDI_ICON1 ICON DISCARDABLE "favicon.ico" |
After Width: | Height: | Size: 342 B |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 352 B |
After Width: | Height: | Size: 357 B |
@ -0,0 +1,11 @@ |
|||
<RCC> |
|||
<qresource prefix="img"> |
|||
<file>favicon.ico</file> |
|||
</qresource> |
|||
<qresource prefix="png"> |
|||
<file>close.png</file> |
|||
<file>fullscreen3.png</file> |
|||
<file>fullscreen4.png</file> |
|||
<file>min.png</file> |
|||
</qresource> |
|||
</RCC> |
After Width: | Height: | Size: 150 B |
@ -0,0 +1,145 @@ |
|||
//
|
|||
// Created by 12038 on 2022/6/16.
|
|||
//
|
|||
#include <QDateTime> |
|||
#include "Rename.h" |
|||
#include <QProcess> |
|||
|
|||
Rename::Rename(QObject *) { |
|||
|
|||
} |
|||
|
|||
Rename::~Rename() { |
|||
|
|||
} |
|||
|
|||
void Rename::renameFileSlot(const QString &filePath, const QString &strReplaced, const QString &strNew) { |
|||
// filePath.lastIndexOf('/')
|
|||
renameFile(filePath, strReplaced, strNew); |
|||
} |
|||
|
|||
void Rename::renameFile(const QString &filePath, const QString &strReplaced, const QString &strNew) { |
|||
QFile file(filePath); |
|||
QFileInfo fileInfo(filePath); |
|||
qDebug()<<fileInfo.path(); |
|||
qDebug()<<fileInfo.absolutePath(); |
|||
qDebug()<<fileInfo.fileName(); |
|||
qDebug()<<fileInfo.suffix(); |
|||
qDebug()<<fileInfo.baseName(); |
|||
QString baseName = fileInfo.baseName(); |
|||
QString newBaseName = baseName; |
|||
|
|||
QString oldFileName = file.fileName(); |
|||
qDebug()<< "old:" <<oldFileName; |
|||
QString newFileName = oldFileName; |
|||
|
|||
if(renameMethodFlag == "时间戳") { |
|||
// if(!baseName.contains("flyrecord")) return "";
|
|||
QString timeStampStr = baseName.section('-', -1, -1); |
|||
QString firstName = baseName.section('-', -2, 0); |
|||
qint64 timeStamp = timeStampStr.toLongLong(); |
|||
qDebug() << "时间戳" << timeStamp; |
|||
QDateTime dateTime = QDateTime::fromMSecsSinceEpoch(timeStamp); |
|||
if((!dateTime.isValid()) || (timeStamp == 0) || (dateTime > QDateTime::currentDateTime())){ |
|||
emit newFileNameSignal(tr("时间戳有误")); |
|||
return; |
|||
}; |
|||
QString time = dateTime.toString("yyyyMMddhhmmss"); //时间戳非毫秒级
|
|||
QString time1 = dateTime.toString("yyyy-MM-dd hh:mm:ss"); |
|||
qDebug() << time1; |
|||
|
|||
newBaseName = firstName + '-' +time; |
|||
} |
|||
else if(renameMethodFlag == "替换"){ |
|||
qDebug()<<"mode"<<"替换"; |
|||
if(!baseName.contains(strReplaced)) { |
|||
emit newFileNameSignal("文件名中不存在输入的字符串"); |
|||
return; |
|||
}; |
|||
if(strNew == ""){ |
|||
emit newFileNameSignal("新替换的字符串为空"); |
|||
return; |
|||
} |
|||
if(strReplaced == "") { |
|||
newBaseName = strNew; |
|||
} |
|||
else{ |
|||
newBaseName = baseName.replace(strReplaced, strNew); |
|||
qDebug()<<"newBaseName:"<<newBaseName; |
|||
} |
|||
} |
|||
dirFiles.clear(); |
|||
dirFiles = getFiles(fileInfo.absolutePath()); |
|||
newFileName = fileInfo.absolutePath() + '/' + newBaseName + '.' + fileInfo.suffix(); |
|||
if(dirFiles.contains(newFileName)){ |
|||
newFileName = fileInfo.absolutePath() + '/' + newBaseName + '-' + baseName +'.' + fileInfo.suffix(); |
|||
} |
|||
qDebug()<< "new:" <<newFileName; |
|||
|
|||
file.rename(newFileName); |
|||
emit newFileNameSignal(newFileName); |
|||
} |
|||
|
|||
void Rename::getFilesSlot(const QString &filesDirPath, const QString &strReplaced, const QString &strNew) { |
|||
//获取文件夹下所有的文件
|
|||
QStringList files= this->getFiles(filesDirPath); |
|||
// emit oldFileNameSignal(files);
|
|||
QStringList newFiles; |
|||
for (int i = 0; i < files.count(); i++){ |
|||
QString fileName = files.at(i); |
|||
emit oldFileNameSignal(fileName); |
|||
renameFile(fileName, strReplaced, strNew); |
|||
// emit newFileNameSignal(newFile);
|
|||
emit process(i + 1, files.count()); |
|||
} |
|||
} |
|||
|
|||
QStringList Rename::getFiles(const QString &filesDirPath) { |
|||
QStringList files; |
|||
QDir filesDir(filesDirPath); |
|||
QList<QFileInfo> fileInfoList = filesDir.entryInfoList(QDir::Files); |
|||
for(int i = 0; i < fileInfoList.count(); i++){ |
|||
QFileInfo fileInfo = fileInfoList.at(i); |
|||
if(fileInfo.isDir()){ |
|||
// QStringList subFiles= getFiles(fileInfo.absoluteFilePath());
|
|||
// files.append(subFiles);
|
|||
continue; |
|||
} |
|||
else{ |
|||
QString fileName = fileInfo.absoluteFilePath(); |
|||
files.append(fileName); |
|||
} |
|||
} |
|||
return files; |
|||
} |
|||
|
|||
void Rename::checkBoxChangedSlot(int) { |
|||
|
|||
} |
|||
|
|||
void Rename::comboxStateChangedSlot(const QString & text) { |
|||
renameMethodFlag = text; |
|||
qDebug()<< renameMethodFlag; |
|||
} |
|||
|
|||
void Rename::getTextSlot(const QString &text) { |
|||
qDebug()<<"widget当前的text为:"<< text; |
|||
currentText = text; |
|||
} |
|||
|
|||
void Rename::openDirSlot() { |
|||
QFileInfo fileInfo(currentText); |
|||
QString filePath = fileInfo.absolutePath(); |
|||
qDebug()<<"filePath"<<filePath; |
|||
QString path = filePath.replace("/", "\\"); |
|||
qDebug()<<"path"<<path; |
|||
QProcess::startDetached("explorer " + path); |
|||
} |
|||
|
|||
void Rename::delActionTriggeredSlot() { |
|||
QFile file(currentText); |
|||
qDebug()<<"即将删除:"<<currentText; |
|||
emit delActionFeedbackSignal(file.remove()); |
|||
qDebug()<<"删除成功"; |
|||
} |
|||
|
@ -0,0 +1,57 @@ |
|||
//
|
|||
// Created by 12038 on 2022/6/16.
|
|||
//
|
|||
|
|||
#ifndef DUPLICATEFILESCHECK_DUPLICATEFILES_H |
|||
#define DUPLICATEFILESCHECK_DUPLICATEFILES_H |
|||
|
|||
#include <QObject> |
|||
#include <QHash> |
|||
#include <QDebug> |
|||
#include <QFile> |
|||
#include <QCryptographicHash> |
|||
#include <QDir> |
|||
|
|||
class Rename : public QObject{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
Rename(QObject *parent = nullptr); |
|||
~Rename(); |
|||
|
|||
signals: |
|||
void oldFileNameSignal(const QString &); |
|||
void newFileNameSignal(const QString &); |
|||
void process(const int &, const int &); |
|||
void singleFileSignal(const QString &); |
|||
|
|||
void delActionFeedbackSignal(bool delFlag); |
|||
|
|||
|
|||
|
|||
public slots: |
|||
void getFilesSlot(const QString & filesDirPath, const QString &strReplaced, const QString &strNew); |
|||
void renameFileSlot(const QString &filePath, const QString &strReplaced, const QString &strNew); |
|||
void checkBoxChangedSlot(int ); |
|||
void comboxStateChangedSlot(const QString &); |
|||
|
|||
void openDirSlot(); |
|||
void delActionTriggeredSlot(); |
|||
void getTextSlot(const QString &text); |
|||
|
|||
private: |
|||
void renameFile(const QString &filePath, const QString &strReplaced, const QString &strNew); |
|||
QStringList getFiles(const QString &); |
|||
|
|||
QStringList oldList = QStringList(); |
|||
QStringList newList = QStringList(); |
|||
|
|||
QString renameMethodFlag = "替换"; |
|||
QStringList dirFiles = QStringList(); |
|||
|
|||
QString currentText = ""; |
|||
|
|||
}; |
|||
|
|||
|
|||
#endif //DUPLICATEFILESCHECK_DUPLICATEFILES_H
|
@ -0,0 +1,10 @@ |
|||
#include <QApplication> |
|||
#include "widget.h" |
|||
|
|||
int main(int argc, char *argv[]) { |
|||
QApplication a(argc, argv); |
|||
qRegisterMetaType<QHash<QByteArray,QStringList>>("QHash<QByteArray,QStringList>"); |
|||
Widget w; |
|||
w.show(); |
|||
return QApplication::exec(); |
|||
} |
@ -0,0 +1,252 @@ |
|||
//
|
|||
// Created by 12038 on 2022/6/15.
|
|||
//
|
|||
|
|||
// You may need to build the project (run Qt uic code generator) to get "ui_Widget.h" resolved
|
|||
|
|||
#include "widget.h" |
|||
#include "ui_widget.h" |
|||
|
|||
Widget::Widget(QWidget *parent) |
|||
: QWidget(parent) |
|||
, ui(new Ui::Widget) |
|||
{ |
|||
ui->setupUi(this); |
|||
//取消菜单栏
|
|||
this->setWindowFlags(Qt::FramelessWindowHint); |
|||
|
|||
//阴影边框效果
|
|||
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect(); |
|||
shadow->setBlurRadius(10); |
|||
shadow->setColor(Qt::black); |
|||
shadow->setOffset(0); |
|||
|
|||
ui->shadowWidget->setGraphicsEffect(shadow); |
|||
|
|||
//父窗口透明
|
|||
this->setAttribute(Qt::WA_TranslucentBackground); |
|||
|
|||
//最大化最小化关闭功能实现
|
|||
connect(ui->btnMax, SIGNAL(clicked()), this, SLOT(btnMaxClickedSlot())); |
|||
connect(ui->btnMin, SIGNAL(clicked()), this, SLOT(btnMinClickedSlot())); |
|||
connect(ui->btnClose, SIGNAL(clicked()), this, SLOT(btnCloseClickedSlot())); |
|||
|
|||
ui->btnMin->setStyleSheet("border-image: url(:/png/min.png)"); |
|||
ui->btnMax->setStyleSheet("border-image: url(:/png/fullscreen3.png)"); |
|||
ui->btnClose->setStyleSheet("border-image: url(:/png/close.png)"); |
|||
|
|||
|
|||
renameFile = new Rename(); |
|||
myThread = new QThread(); |
|||
renameFile->moveToThread(myThread); |
|||
myThread->start(); |
|||
connect(renameFile, SIGNAL(destroyed(QObject *)), |
|||
myThread, SLOT(deleteLater())); |
|||
|
|||
// ui->labelTitle->setText(" 文件重命名");
|
|||
connect(ui->btnSelectFile, SIGNAL(clicked(bool)), this, SLOT(selectFileClickedSlot())); |
|||
connect(ui->btnSelectDir, SIGNAL(clicked(bool)), this, SLOT(selectDirClickedSlot())); |
|||
connect(this, SIGNAL(fileSelectedSignal(const QString &, const QString &, const QString &)), |
|||
renameFile, SLOT(renameFileSlot(const QString &, const QString &, const QString &))); |
|||
|
|||
connect(this, SIGNAL(getFilesSignal(const QString &, const QString &, const QString &)), |
|||
renameFile, SLOT(getFilesSlot(const QString &, const QString &, const QString &))); |
|||
|
|||
|
|||
connect(renameFile, SIGNAL(process(const int &, const int &)), |
|||
this, SLOT(processSlot(const int &, const int &))); |
|||
connect(renameFile, SIGNAL(oldFileNameSignal(const QString &)), |
|||
this, SLOT(oldFileNameSlot(const QString &))); |
|||
connect(renameFile, SIGNAL(newFileNameSignal(const QString &)), |
|||
this, SLOT(newFileNameSlot(const QString &))); |
|||
connect(renameFile, SIGNAL(singleFileSignal(const QString &)), |
|||
this, SLOT(newFileNameSlot(const QString &))); |
|||
|
|||
connect(ui->comboBox, SIGNAL(currentTextChanged(QString)), |
|||
renameFile, SLOT(comboxStateChangedSlot(const QString &))); |
|||
|
|||
connect(ui->btnConfirm, SIGNAL(clicked()), |
|||
this, SLOT(btnConfirmClickedSlot())); |
|||
|
|||
ui->listWidget_2->setContextMenuPolicy(Qt::CustomContextMenu); |
|||
connect(ui->listWidget_2, SIGNAL(customContextMenuRequested(const QPoint &)), |
|||
this, SLOT(on_listWidget_customContextMenuRequested(const QPoint &))); |
|||
|
|||
delAction = new QAction(); |
|||
delAction->setText("删除文件"); |
|||
openAction = new QAction(); |
|||
openAction->setText("打开文件目录"); |
|||
|
|||
connect(delAction, SIGNAL(triggered(bool)), |
|||
renameFile, SLOT(delActionTriggeredSlot())); |
|||
connect(ui->listWidget_2, SIGNAL(currentTextChanged(const QString &)), |
|||
renameFile, SLOT(getTextSlot(const QString &))); |
|||
connect(openAction, SIGNAL(triggered(bool)), |
|||
renameFile, SLOT(openDirSlot())); |
|||
connect(renameFile, SIGNAL(delActionFeedbackSignal(bool)), |
|||
this, SLOT(delActionFeedbackSlot(bool))); |
|||
} |
|||
|
|||
Widget::~Widget() |
|||
{ |
|||
renameFile->deleteLater(); |
|||
myThread->exit(); |
|||
myThread->wait(10 * 1000); |
|||
openAction->deleteLater(); |
|||
delAction->deleteLater(); |
|||
delete ui; |
|||
} |
|||
|
|||
void Widget::mousePressEvent(QMouseEvent *event) |
|||
{ |
|||
// QWidget::mousePressEvent(event);
|
|||
QPoint mouseStartPoint = event->globalPos(); |
|||
QPoint windowLeftTopPoint = this->geometry().topLeft(); |
|||
this->mousePosInWindow = mouseStartPoint - windowLeftTopPoint; |
|||
} |
|||
|
|||
void Widget::mouseMoveEvent(QMouseEvent *event) |
|||
{ |
|||
// QWidget::mouseMoveEvent(event);
|
|||
if(this->mousePosInWindow == QPoint()) return; |
|||
QPoint mousePoint = event->globalPos(); |
|||
QPoint windowLeftTopPoint = mousePoint - this->mousePosInWindow; |
|||
this->move(windowLeftTopPoint); |
|||
} |
|||
|
|||
void Widget::mouseReleaseEvent(QMouseEvent *) |
|||
{ |
|||
this->mousePosInWindow = QPoint(); |
|||
} |
|||
|
|||
void Widget::closeEvent(QCloseEvent *event) |
|||
{ |
|||
QMessageBox::StandardButton button; |
|||
button=QMessageBox::question(this,tr("退出程序"),QString(tr("确认退出程序?")),QMessageBox::Yes|QMessageBox::No); |
|||
if(button==QMessageBox::No) |
|||
{ |
|||
event->ignore(); // 忽略退出信号,程序继续进行
|
|||
} |
|||
else if(button==QMessageBox::Yes) |
|||
{ |
|||
event->accept(); // 接受退出信号,程序退出
|
|||
} |
|||
} |
|||
|
|||
void Widget::btnMaxClickedSlot() |
|||
{ |
|||
ui->btnMax->setStyleSheet("border-image: url(:/png/fullscreen4.png)"); |
|||
if(this->isMaximized()){ |
|||
ui->layoutMain->setMargin(9); |
|||
ui->btnMax->setStyleSheet("border-image: url(:/png/fullscreen3.png)"); |
|||
this->showNormal(); |
|||
} |
|||
else{ |
|||
ui->layoutMain->setMargin(0); |
|||
ui->btnMax->setStyleSheet("border-image: url(:/png/fullscreen4.png)"); |
|||
this->showMaximized(); |
|||
} |
|||
} |
|||
|
|||
void Widget::btnMinClickedSlot() |
|||
{ |
|||
this->showMinimized(); |
|||
} |
|||
|
|||
void Widget::btnCloseClickedSlot() |
|||
{ |
|||
this->close(); |
|||
} |
|||
|
|||
void Widget::selectFileClickedSlot() { |
|||
if(!confirmFlag){ |
|||
QMessageBox::information(this, "提示", "请先确认配置信息:模式为"+ui->comboBox->currentText()); |
|||
return; |
|||
} |
|||
QString path = QFileDialog::getOpenFileName( |
|||
this, "选择文件", |
|||
"", |
|||
""); |
|||
if (path == "") return; |
|||
|
|||
ui->progressBar->setValue(0); |
|||
ui->listWidget->clear(); |
|||
ui->listWidget_2->clear(); |
|||
ui->listWidget->addItem(path); |
|||
|
|||
emit fileSelectedSignal(path, ui->leMd5Show->text(), ui->lineEdit->text()); |
|||
} |
|||
|
|||
void Widget::selectDirClickedSlot() { |
|||
if(!confirmFlag){ |
|||
QMessageBox::information(this, "提示", "请先确认配置信息:模式为"+ui->comboBox->currentText()); |
|||
return; |
|||
} |
|||
QString dirPathUrl = QFileDialog::getExistingDirectory(this, "选择文件夹", ""); |
|||
ui->lineDIrShow->setText(dirPathUrl); |
|||
if (dirPathUrl == "") return; |
|||
ui->progressBar->setValue(0); |
|||
ui->listWidget->clear(); |
|||
ui->listWidget_2->clear(); |
|||
// ui->leMd5Show->clear();
|
|||
emit getFilesSignal(dirPathUrl, ui->leMd5Show->text(), ui->lineEdit->text()); |
|||
} |
|||
|
|||
void Widget::processSlot(const int &now, const int &total) { |
|||
ui->progressBar->setMaximum(total); |
|||
ui->progressBar->setValue(now); |
|||
} |
|||
|
|||
void Widget::oldFileNameSlot(const QString &oldName) { |
|||
ui->listWidget->addItem(oldName); |
|||
} |
|||
|
|||
void Widget::newFileNameSlot(const QString &newName) { |
|||
ui->listWidget_2->addItem(newName); |
|||
} |
|||
|
|||
void Widget::btnConfirmClickedSlot() { |
|||
QString s = ui->lineEdit->text(); |
|||
if(s.contains('/') || s.contains('\\') || s.contains('<') || s.contains('>') || s.contains('?') || s.contains('*') || s.contains(':') || s.contains('|') || s.contains('"')){ |
|||
QMessageBox::critical(this, "错误", "文件名中不能包含/\\|<>:?*等字符"); |
|||
return; |
|||
} |
|||
confirmFlag = true; |
|||
} |
|||
|
|||
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->openAction); |
|||
menu->addAction(this->delAction); |
|||
// 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; |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,76 @@ |
|||
//
|
|||
// Created by 12038 on 2022/6/15.
|
|||
//
|
|||
|
|||
#ifndef DUPLICATEFILESCHECK_WIDGET_H |
|||
#define DUPLICATEFILESCHECK_WIDGET_H |
|||
|
|||
#include <QMouseEvent> |
|||
#include <QWidget> |
|||
#include <QPoint> |
|||
#include <QGraphicsDropShadowEffect> |
|||
#include <QMessageBox> |
|||
#include "Rename.h" |
|||
#include <QDir> |
|||
#include <QDebug> |
|||
#include <QThread> |
|||
#include <QFileDialog> |
|||
#include <QMenu> |
|||
|
|||
QT_BEGIN_NAMESPACE |
|||
namespace Ui { class Widget; } |
|||
QT_END_NAMESPACE |
|||
|
|||
class Widget : public QWidget |
|||
{ |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
Widget(QWidget *parent = nullptr); |
|||
~Widget(); |
|||
|
|||
protected: |
|||
void mousePressEvent(QMouseEvent *event); |
|||
void mouseMoveEvent(QMouseEvent *event); |
|||
void mouseReleaseEvent(QMouseEvent *event); |
|||
|
|||
void closeEvent(QCloseEvent *event); |
|||
|
|||
signals: |
|||
void fileSelectedSignal(const QString &path, const QString &strReplaced, const QString &strNew); |
|||
void getFilesSignal(const QString &dirPath, const QString &strReplaced, const QString &strNew); |
|||
void comboxStateChangedSignal(const QString &); |
|||
|
|||
public slots: |
|||
void processSlot(const int &, const int &); |
|||
void oldFileNameSlot(const QString & oldName); |
|||
void newFileNameSlot(const QString & newName); |
|||
|
|||
void delActionFeedbackSlot(bool flag); |
|||
|
|||
private slots: |
|||
void btnMaxClickedSlot(); |
|||
void btnMinClickedSlot(); |
|||
void btnCloseClickedSlot(); |
|||
void selectFileClickedSlot(); |
|||
void selectDirClickedSlot(); |
|||
void btnConfirmClickedSlot(); |
|||
|
|||
void on_listWidget_customContextMenuRequested(const QPoint &pos); |
|||
|
|||
private: |
|||
Ui::Widget *ui; |
|||
Rename * renameFile; |
|||
QThread *myThread; |
|||
|
|||
QPoint mousePosInWindow = QPoint(); |
|||
bool confirmFlag = false; |
|||
|
|||
QAction *delAction; |
|||
QAction *openAction; |
|||
|
|||
|
|||
}; |
|||
|
|||
|
|||
#endif //DUPLICATEFILESCHECK_WIDGET_H
|
@ -0,0 +1,549 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>Widget</class> |
|||
<widget class="QWidget" name="Widget"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>950</width> |
|||
<height>668</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>Widget</string> |
|||
</property> |
|||
<layout class="QGridLayout" name="layoutMain"> |
|||
<property name="leftMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<item row="0" column="0"> |
|||
<widget class="QWidget" name="shadowWidget" native="true"> |
|||
<property name="styleSheet"> |
|||
<string notr="true">#shadowWidget{ |
|||
background-color: rgb(255, 255, 255); |
|||
border-radius: 5px; |
|||
} |
|||
</string> |
|||
</property> |
|||
<layout class="QGridLayout" name="gridLayout_2"> |
|||
<property name="leftMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="topMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="bottomMargin"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="spacing"> |
|||
<number>0</number> |
|||
</property> |
|||
<item row="0" column="0"> |
|||
<layout class="QHBoxLayout" name="horizontalLayout"> |
|||
<property name="spacing"> |
|||
<number>0</number> |
|||
</property> |
|||
<property name="leftMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<property name="rightMargin"> |
|||
<number>9</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QLabel" name="labelTitle"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<property name="font"> |
|||
<font> |
|||
<family>微软雅黑</family> |
|||
<pointsize>12</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="text"> |
|||
<string> 文件重命名工具</string> |
|||
</property> |
|||
<property name="alignment"> |
|||
<set>Qt::AlignCenter</set> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btnMin"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>32</width> |
|||
<height>32</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>32</width> |
|||
<height>32</height> |
|||
</size> |
|||
</property> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>14</pointsize> |
|||
<weight>50</weight> |
|||
<bold>false</bold> |
|||
</font> |
|||
</property> |
|||
<property name="styleSheet"> |
|||
<string notr="true">QPushButton |
|||
{ |
|||
border:none; |
|||
border-image: url(../resources/min.jpeg) |
|||
} |
|||
|
|||
QPushButton:hover |
|||
{ |
|||
background-color: rgb(232, 232, 232); |
|||
} |
|||
QPushButton:pressed |
|||
{ |
|||
background-color: rgb(162, 162, 162); |
|||
} |
|||
|
|||
|
|||
|
|||
</string> |
|||
</property> |
|||
<property name="text"> |
|||
<string/> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btnMin_2"> |
|||
<property name="enabled"> |
|||
<bool>false</bool> |
|||
</property> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>30</width> |
|||
<height>10</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>30</width> |
|||
<height>10</height> |
|||
</size> |
|||
</property> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>14</pointsize> |
|||
<weight>50</weight> |
|||
<bold>false</bold> |
|||
</font> |
|||
</property> |
|||
<property name="styleSheet"> |
|||
<string notr="true">QPushButton |
|||
{ |
|||
border:none; |
|||
} |
|||
|
|||
QPushButton:hover |
|||
{ |
|||
background-color: rgb(232, 232, 232); |
|||
} |
|||
QPushButton:pressed |
|||
{ |
|||
background-color: rgb(162, 162, 162); |
|||
} |
|||
|
|||
|
|||
|
|||
</string> |
|||
</property> |
|||
<property name="text"> |
|||
<string/> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btnMax"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>32</width> |
|||
<height>32</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>32</width> |
|||
<height>32</height> |
|||
</size> |
|||
</property> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>14</pointsize> |
|||
<weight>50</weight> |
|||
<bold>false</bold> |
|||
</font> |
|||
</property> |
|||
<property name="styleSheet"> |
|||
<string notr="true">QPushButton |
|||
{ |
|||
border:none; |
|||
border-image: url(../resources/fullscreen3.jpeg) |
|||
} |
|||
QPushButton:hover |
|||
{ |
|||
background-color: rgb(232, 232, 232); |
|||
} |
|||
QPushButton:pressed |
|||
{ |
|||
background-color: rgb(162, 162, 162); |
|||
}</string> |
|||
</property> |
|||
<property name="text"> |
|||
<string/> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btnMin_3"> |
|||
<property name="enabled"> |
|||
<bool>false</bool> |
|||
</property> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>30</width> |
|||
<height>10</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>30</width> |
|||
<height>10</height> |
|||
</size> |
|||
</property> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>14</pointsize> |
|||
<weight>50</weight> |
|||
<bold>false</bold> |
|||
</font> |
|||
</property> |
|||
<property name="styleSheet"> |
|||
<string notr="true">QPushButton |
|||
{ |
|||
border:none; |
|||
} |
|||
|
|||
QPushButton:hover |
|||
{ |
|||
background-color: rgb(232, 232, 232); |
|||
} |
|||
QPushButton:pressed |
|||
{ |
|||
background-color: rgb(162, 162, 162); |
|||
} |
|||
|
|||
|
|||
|
|||
</string> |
|||
</property> |
|||
<property name="text"> |
|||
<string/> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btnClose"> |
|||
<property name="minimumSize"> |
|||
<size> |
|||
<width>30</width> |
|||
<height>30</height> |
|||
</size> |
|||
</property> |
|||
<property name="maximumSize"> |
|||
<size> |
|||
<width>30</width> |
|||
<height>30</height> |
|||
</size> |
|||
</property> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>14</pointsize> |
|||
<weight>50</weight> |
|||
<bold>false</bold> |
|||
</font> |
|||
</property> |
|||
<property name="styleSheet"> |
|||
<string notr="true">QPushButton |
|||
{ |
|||
border:none; |
|||
border-top-right-radius: 5px; |
|||
border-image: url(../resources/close.jpeg) |
|||
} |
|||
|
|||
QPushButton:hover |
|||
{ |
|||
background-color: rgb(253, 0, 0); |
|||
} |
|||
QPushButton:pressed |
|||
{ |
|||
background-color: rgb(211, 0, 0); |
|||
} |
|||
|
|||
|
|||
|
|||
</string> |
|||
</property> |
|||
<property name="text"> |
|||
<string/> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
<item row="1" column="0"> |
|||
<widget class="QWidget" name="widget" native="true"> |
|||
<property name="sizePolicy"> |
|||
<sizepolicy hsizetype="Preferred" vsizetype="Expanding"> |
|||
<horstretch>0</horstretch> |
|||
<verstretch>0</verstretch> |
|||
</sizepolicy> |
|||
</property> |
|||
<layout class="QVBoxLayout" name="verticalLayout"> |
|||
<property name="topMargin"> |
|||
<number>10</number> |
|||
</property> |
|||
<item> |
|||
<widget class="QGroupBox" name="groupBox"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>10</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="layoutDirection"> |
|||
<enum>Qt::LeftToRight</enum> |
|||
</property> |
|||
<property name="title"> |
|||
<string>配置</string> |
|||
</property> |
|||
<property name="alignment"> |
|||
<set>Qt::AlignCenter</set> |
|||
</property> |
|||
<layout class="QGridLayout" name="gridLayout"> |
|||
<item row="0" column="4"> |
|||
<widget class="QComboBox" name="comboBox"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>12</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="editable"> |
|||
<bool>false</bool> |
|||
</property> |
|||
<property name="duplicatesEnabled"> |
|||
<bool>false</bool> |
|||
</property> |
|||
<item> |
|||
<property name="text"> |
|||
<string>替换</string> |
|||
</property> |
|||
</item> |
|||
<item> |
|||
<property name="text"> |
|||
<string>时间戳</string> |
|||
</property> |
|||
</item> |
|||
</widget> |
|||
</item> |
|||
<item row="0" column="1"> |
|||
<widget class="QLineEdit" name="leMd5Show"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>12</pointsize> |
|||
</font> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="0" column="2"> |
|||
<widget class="QLabel" name="label_2"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>12</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="text"> |
|||
<string>新</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="0" column="3"> |
|||
<widget class="QLineEdit" name="lineEdit"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>12</pointsize> |
|||
</font> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="0" column="0"> |
|||
<widget class="QLabel" name="label"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>12</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="text"> |
|||
<string>旧</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item row="0" column="5"> |
|||
<widget class="QPushButton" name="btnConfirm"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>12</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="styleSheet"> |
|||
<string notr="true">QPushButton:hover |
|||
{ |
|||
background-color: #00aaff; |
|||
} |
|||
QPushButton:pressed |
|||
{ |
|||
background-color: rgb(0, 124, 186); |
|||
|
|||
}</string> |
|||
</property> |
|||
<property name="text"> |
|||
<string>确认</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QGroupBox" name="groupBox_2"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>10</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="title"> |
|||
<string>重命名</string> |
|||
</property> |
|||
<property name="alignment"> |
|||
<set>Qt::AlignCenter</set> |
|||
</property> |
|||
<layout class="QGridLayout" name="gridLayout_3"> |
|||
<item row="0" column="0"> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_2"> |
|||
<item> |
|||
<widget class="QPushButton" name="btnSelectFile"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>12</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="styleSheet"> |
|||
<string notr="true">QPushButton:hover |
|||
{ |
|||
background-color: #00aaff; |
|||
} |
|||
QPushButton:pressed |
|||
{ |
|||
background-color: rgb(0, 124, 186); |
|||
|
|||
}</string> |
|||
</property> |
|||
<property name="text"> |
|||
<string>选择文件</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QPushButton" name="btnSelectDir"> |
|||
<property name="font"> |
|||
<font> |
|||
<pointsize>12</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="styleSheet"> |
|||
<string notr="true">QPushButton:hover |
|||
{ |
|||
background-color: #00aaff; |
|||
} |
|||
QPushButton:pressed |
|||
{ |
|||
background-color: rgb(0, 124, 186); |
|||
|
|||
}</string> |
|||
</property> |
|||
<property name="text"> |
|||
<string>选择目录</string> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QLineEdit" name="lineDIrShow"/> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
<item row="1" column="0"> |
|||
<layout class="QHBoxLayout" name="horizontalLayout_3"> |
|||
<item> |
|||
<widget class="QListWidget" name="listWidget"> |
|||
<property name="enabled"> |
|||
<bool>true</bool> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
<item> |
|||
<widget class="QListWidget" name="listWidget_2"> |
|||
<property name="enabled"> |
|||
<bool>true</bool> |
|||
</property> |
|||
<property name="contextMenuPolicy"> |
|||
<enum>Qt::CustomContextMenu</enum> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</item> |
|||
<item row="2" column="0"> |
|||
<widget class="QProgressBar" name="progressBar"> |
|||
<property name="value"> |
|||
<number>0</number> |
|||
</property> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
</item> |
|||
</layout> |
|||
</widget> |
|||
<resources/> |
|||
<connections/> |
|||
</ui> |