tianzhendong
2 years ago
commit
93f783e53b
14 changed files with 931 additions and 0 deletions
@ -0,0 +1,84 @@ |
|||||
|
# This file is used to ignore files which are generated |
||||
|
# ---------------------------------------------------------------------------- |
||||
|
|
||||
|
*~ |
||||
|
*.autosave |
||||
|
*.a |
||||
|
*.core |
||||
|
*.moc |
||||
|
*.o |
||||
|
*.obj |
||||
|
*.orig |
||||
|
*.rej |
||||
|
*.so |
||||
|
*.so.* |
||||
|
*_pch.h.cpp |
||||
|
*_resource.rc |
||||
|
*.qm |
||||
|
.#* |
||||
|
*.*# |
||||
|
core |
||||
|
!core/ |
||||
|
tags |
||||
|
.DS_Store |
||||
|
.directory |
||||
|
*.debug |
||||
|
Makefile* |
||||
|
*.prl |
||||
|
*.app |
||||
|
moc_*.cpp |
||||
|
ui_*.h |
||||
|
qrc_*.cpp |
||||
|
Thumbs.db |
||||
|
*.res |
||||
|
*.rc |
||||
|
/.qmake.cache |
||||
|
/.qmake.stash |
||||
|
|
||||
|
# qtcreator generated files |
||||
|
*.pro.user* |
||||
|
|
||||
|
# xemacs temporary files |
||||
|
*.flc |
||||
|
|
||||
|
# Vim temporary files |
||||
|
.*.swp |
||||
|
|
||||
|
# Visual Studio generated files |
||||
|
*.ib_pdb_index |
||||
|
*.idb |
||||
|
*.ilk |
||||
|
*.pdb |
||||
|
*.sln |
||||
|
*.suo |
||||
|
*.vcproj |
||||
|
*vcproj.*.*.user |
||||
|
*.ncb |
||||
|
*.sdf |
||||
|
*.opensdf |
||||
|
*.vcxproj |
||||
|
*vcxproj.* |
||||
|
|
||||
|
# MinGW generated files |
||||
|
*.Debug |
||||
|
*.Release |
||||
|
|
||||
|
# Python byte code |
||||
|
*.pyc |
||||
|
|
||||
|
# Binaries |
||||
|
# -------- |
||||
|
*.dll |
||||
|
*.exe |
||||
|
build*/ |
||||
|
build-* |
||||
|
build-*/ |
||||
|
build* |
||||
|
!.vscode |
||||
|
debug/ |
||||
|
debug |
||||
|
release/ |
||||
|
release |
||||
|
cmake-build*/ |
||||
|
.idea/ |
||||
|
|
@ -0,0 +1,53 @@ |
|||||
|
cmake_minimum_required(VERSION 3.22) |
||||
|
project(DuplicateFilesCheck) |
||||
|
|
||||
|
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") |
||||
|
|
||||
|
find_package(Qt5 COMPONENTS |
||||
|
Core |
||||
|
Gui |
||||
|
Widgets |
||||
|
REQUIRED) |
||||
|
|
||||
|
include_directories(resources) |
||||
|
|
||||
|
add_executable(DuplicateFilesCheck src/main.cpp app_win32.rc src/widget.cpp src/widget.h src/widget.ui src/DuplicateFiles.cpp src/DuplicateFiles.h) |
||||
|
target_link_libraries(DuplicateFilesCheck |
||||
|
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,8 @@ |
|||||
|
# 重复文件检测工具 |
||||
|
## 环境 |
||||
|
- Clion 2022.1.2 |
||||
|
- qt 5.14.2 |
||||
|
## 功能 |
||||
|
- 单个文件计算md5 |
||||
|
- 文件夹内重复文件检测 |
||||
|
|
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 342 B |
After Width: | Height: | Size: 352 B |
After Width: | Height: | Size: 357 B |
After Width: | Height: | Size: 150 B |
@ -0,0 +1,75 @@ |
|||||
|
//
|
||||
|
// Created by 12038 on 2022/6/16.
|
||||
|
//
|
||||
|
#include "DuplicateFiles.h" |
||||
|
|
||||
|
DuplicateFiles::DuplicateFiles(QObject *) { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
DuplicateFiles::~DuplicateFiles() { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
void DuplicateFiles::calMd5Slot(const QString &filePath) { |
||||
|
QByteArray md5 = calMd5(filePath); |
||||
|
emit md5Signal(md5); |
||||
|
} |
||||
|
|
||||
|
QByteArray DuplicateFiles::calMd5(const QString &filePath) { |
||||
|
QFile file(filePath); |
||||
|
QByteArray md5 = ""; |
||||
|
if(file.open(QIODevice::ReadOnly)){ |
||||
|
QCryptographicHash hash(QCryptographicHash::Md5); |
||||
|
while(!file.atEnd()){ |
||||
|
QByteArray buff = file.read(100 * 1024 * 1024); |
||||
|
hash.addData(buff); |
||||
|
} |
||||
|
md5 = hash.result().toHex(); |
||||
|
file.close(); |
||||
|
} |
||||
|
return md5; |
||||
|
} |
||||
|
|
||||
|
void DuplicateFiles::getFilesSlot(const QString &filesDirPath) { |
||||
|
//获取文件夹下所有的文件
|
||||
|
QStringList files= this->getFiles(filesDirPath); |
||||
|
//计算md5,并存到map中
|
||||
|
QHash<QByteArray, QStringList> md5Results; |
||||
|
for (int i = 0; i < files.count(); i++){ |
||||
|
QString fileName = files.at(i); |
||||
|
QByteArray fileMd5 = calMd5(fileName); |
||||
|
md5Results[fileMd5].append(fileName); |
||||
|
qDebug() <<"file:" << fileName << "md5:"<< fileMd5; |
||||
|
emit process(i + 1, files.count()); |
||||
|
} |
||||
|
//找出map中value大于1的
|
||||
|
for (QHash<QByteArray, QStringList>::iterator itr = md5Results.begin(); itr != md5Results.end(); itr++){ |
||||
|
if(itr.value().count() > 1){ |
||||
|
qDebug()<< "md5:"<<itr.key()<<"file:"<<itr.value(); |
||||
|
duplicateFiles[itr.key()] = itr.value(); |
||||
|
} |
||||
|
} |
||||
|
// emit filesSignal(files);
|
||||
|
emit duplicateFilesSignal(duplicateFiles); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
QStringList DuplicateFiles::getFiles(const QString &filesDirPath) { |
||||
|
QStringList files; |
||||
|
QDir filesDir(filesDirPath); |
||||
|
QList<QFileInfo> fileInfoList = filesDir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); |
||||
|
for(int i = 0; i < fileInfoList.count(); i++){ |
||||
|
QFileInfo fileInfo = fileInfoList.at(i); |
||||
|
if(fileInfo.isDir()){ |
||||
|
QStringList subFiles= getFiles(fileInfo.absoluteFilePath()); |
||||
|
files.append(subFiles); |
||||
|
} |
||||
|
else{ |
||||
|
QString fileName = fileInfo.absoluteFilePath(); |
||||
|
files.append(fileName); |
||||
|
} |
||||
|
} |
||||
|
return files; |
||||
|
} |
||||
|
|
@ -0,0 +1,40 @@ |
|||||
|
//
|
||||
|
// 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 DuplicateFiles : public QObject{ |
||||
|
Q_OBJECT |
||||
|
|
||||
|
public: |
||||
|
DuplicateFiles(QObject *parent = nullptr); |
||||
|
~DuplicateFiles(); |
||||
|
|
||||
|
signals: |
||||
|
void md5Signal(const QByteArray &); |
||||
|
void filesSignal(const QStringList &); |
||||
|
void process(const int &, const int &); |
||||
|
void duplicateFilesSignal(const QHash<QByteArray, QStringList> &); |
||||
|
|
||||
|
public slots: |
||||
|
void getFilesSlot(const QString & filesDirPath); |
||||
|
void calMd5Slot(const QString &filePath); |
||||
|
|
||||
|
private: |
||||
|
QByteArray calMd5(const QString &filePath); |
||||
|
QStringList getFiles(const QString &); |
||||
|
QHash<QByteArray, QStringList> duplicateFiles; |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#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,178 @@ |
|||||
|
//
|
||||
|
// 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(../resources/min.png)"); |
||||
|
ui->btnMax->setStyleSheet("border-image: url(../resources/fullscreen3.png)"); |
||||
|
ui->btnClose->setStyleSheet("border-image: url(../resources/close.png)"); |
||||
|
|
||||
|
|
||||
|
duplicateFiles = new DuplicateFiles(); |
||||
|
myThread = new QThread(); |
||||
|
duplicateFiles->moveToThread(myThread); |
||||
|
myThread->start(); |
||||
|
connect(duplicateFiles, SIGNAL(destroyed(QObject *)), |
||||
|
myThread, SLOT(deleteLater())); |
||||
|
|
||||
|
ui->labelTitle->setText("文件一致性检测工具"); |
||||
|
connect(ui->btnSelectFile, SIGNAL(clicked(bool)), this, SLOT(calMd5ofFileSlot())); |
||||
|
connect(ui->btnSelectDir, SIGNAL(clicked(bool)), this, SLOT(selectDirSlot())); |
||||
|
connect(this, SIGNAL(calFileMd5Signal(const QString &)), |
||||
|
duplicateFiles, SLOT(calMd5Slot(const QString &))); |
||||
|
connect(duplicateFiles, SIGNAL(md5Signal(const QByteArray &)), |
||||
|
this, SLOT(showFileMd5Slot(const QByteArray &))); |
||||
|
connect(this, SIGNAL(getFilesSignal(const QString &)), |
||||
|
duplicateFiles, SLOT(getFilesSlot(const QString &))); |
||||
|
connect(duplicateFiles, SIGNAL(filesSignal(const QStringList &)), |
||||
|
this, SLOT(filesSlot(const QStringList &))); |
||||
|
|
||||
|
connect(duplicateFiles, SIGNAL(process(const int &, const int &)), |
||||
|
this, SLOT(processSlot(const int &, const int &))); |
||||
|
connect(duplicateFiles, SIGNAL(duplicateFilesSignal(const QHash<QByteArray, QStringList> &)), |
||||
|
this, SLOT(duplicateFilesSlot(const QHash<QByteArray, QStringList> &))); |
||||
|
connect(ui->listWidget, SIGNAL(currentTextChanged(const QString &)), |
||||
|
this, SLOT(currentTextChangedSlot(const QString &))); |
||||
|
} |
||||
|
|
||||
|
Widget::~Widget() |
||||
|
{ |
||||
|
duplicateFiles->deleteLater(); |
||||
|
myThread->exit(); |
||||
|
myThread->wait(10 * 1000); |
||||
|
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(../resources/fullscreen4.png)"); |
||||
|
if(this->isMaximized()){ |
||||
|
ui->layoutMain->setMargin(9); |
||||
|
ui->btnMax->setStyleSheet("border-image: url(../resources/fullscreen3.png)"); |
||||
|
this->showNormal(); |
||||
|
} |
||||
|
else{ |
||||
|
ui->layoutMain->setMargin(0); |
||||
|
ui->btnMax->setStyleSheet("border-image: url(../resources/fullscreen4.png)"); |
||||
|
this->showMaximized(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Widget::btnMinClickedSlot() |
||||
|
{ |
||||
|
this->showMinimized(); |
||||
|
} |
||||
|
|
||||
|
void Widget::btnCloseClickedSlot() |
||||
|
{ |
||||
|
this->close(); |
||||
|
} |
||||
|
|
||||
|
void Widget::calMd5ofFileSlot() { |
||||
|
QString path = QFileDialog::getOpenFileName( |
||||
|
this, "选择文件", |
||||
|
"./", |
||||
|
""); |
||||
|
emit calFileMd5Signal(path); |
||||
|
} |
||||
|
|
||||
|
void Widget::showFileMd5Slot(const QByteArray & md5) { |
||||
|
ui->leMd5Show->setText(""); |
||||
|
ui->leMd5Show->setText(md5); |
||||
|
} |
||||
|
|
||||
|
void Widget::selectDirSlot() { |
||||
|
ui->progressBar->setValue(0); |
||||
|
QString dirPathUrl = QFileDialog::getExistingDirectory(this, "选择文件夹", "./"); |
||||
|
ui->lineDIrShow->setText(dirPathUrl); |
||||
|
emit getFilesSignal(dirPathUrl); |
||||
|
} |
||||
|
|
||||
|
void Widget::filesSlot(const QStringList &files) { |
||||
|
ui->listWidget_2->clear(); |
||||
|
ui->listWidget_2->addItems(files); |
||||
|
} |
||||
|
|
||||
|
void Widget::processSlot(const int &now, const int &total) { |
||||
|
ui->progressBar->setMaximum(total); |
||||
|
ui->progressBar->setValue(now); |
||||
|
} |
||||
|
|
||||
|
void Widget::duplicateFilesSlot(const QHash<QByteArray, QStringList> &duplicateFiles) { |
||||
|
ui->listWidget->clear(); |
||||
|
this->duplicateResults = duplicateFiles; |
||||
|
for(QHash<QByteArray, QStringList>::const_iterator itr = duplicateFiles.begin(); itr != duplicateFiles.end(); itr++){ |
||||
|
ui->listWidget->addItem(itr.key()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Widget::currentTextChangedSlot(const QString ¤tText) { |
||||
|
ui->listWidget_2->clear(); |
||||
|
ui->listWidget_2->addItems(this->duplicateResults[currentText.toLocal8Bit()]); |
||||
|
} |
||||
|
|
||||
|
|
@ -0,0 +1,68 @@ |
|||||
|
//
|
||||
|
// 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 "DuplicateFiles.h" |
||||
|
#include <QDir> |
||||
|
#include <QDebug> |
||||
|
#include <QThread> |
||||
|
#include <QFileDialog> |
||||
|
|
||||
|
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 calFileMd5Signal(const QString &path); |
||||
|
void getFilesSignal(const QString &dirPath); |
||||
|
|
||||
|
public slots: |
||||
|
void showFileMd5Slot(const QByteArray &); |
||||
|
void filesSlot(const QStringList &); |
||||
|
void processSlot(const int &, const int &); |
||||
|
void duplicateFilesSlot(const QHash<QByteArray, QStringList> &); |
||||
|
void currentTextChangedSlot(const QString &); |
||||
|
|
||||
|
private slots: |
||||
|
void btnMaxClickedSlot(); |
||||
|
void btnMinClickedSlot(); |
||||
|
void btnCloseClickedSlot(); |
||||
|
void calMd5ofFileSlot(); |
||||
|
void selectDirSlot(); |
||||
|
|
||||
|
private: |
||||
|
Ui::Widget *ui; |
||||
|
DuplicateFiles * duplicateFiles; |
||||
|
QThread *myThread; |
||||
|
|
||||
|
QPoint mousePosInWindow = QPoint(); |
||||
|
QHash<QByteArray, QStringList> duplicateResults; |
||||
|
|
||||
|
|
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif //DUPLICATEFILESCHECK_WIDGET_H
|
@ -0,0 +1,415 @@ |
|||||
|
<?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>800</width> |
||||
|
<height>600</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>9</number> |
||||
|
</property> |
||||
|
<property name="topMargin"> |
||||
|
<number>9</number> |
||||
|
</property> |
||||
|
<property name="rightMargin"> |
||||
|
<number>9</number> |
||||
|
</property> |
||||
|
<property name="bottomMargin"> |
||||
|
<number>0</number> |
||||
|
</property> |
||||
|
<property name="spacing"> |
||||
|
<number>0</number> |
||||
|
</property> |
||||
|
<item row="0" column="0"> |
||||
|
<layout class="QVBoxLayout" name="verticalLayout"> |
||||
|
<property name="spacing"> |
||||
|
<number>0</number> |
||||
|
</property> |
||||
|
<property name="topMargin"> |
||||
|
<number>9</number> |
||||
|
</property> |
||||
|
<item> |
||||
|
<layout class="QHBoxLayout" name="horizontalLayout"> |
||||
|
<property name="spacing"> |
||||
|
<number>0</number> |
||||
|
</property> |
||||
|
<property name="leftMargin"> |
||||
|
<number>0</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>14</pointsize> |
||||
|
</font> |
||||
|
</property> |
||||
|
<property name="text"> |
||||
|
<string>windowTitle</string> |
||||
|
</property> |
||||
|
<property name="alignment"> |
||||
|
<set>Qt::AlignCenter</set> |
||||
|
</property> |
||||
|
</widget> |
||||
|
</item> |
||||
|
<item> |
||||
|
<widget class="QPushButton" name="btnMin"> |
||||
|
<property name="minimumSize"> |
||||
|
<size> |
||||
|
<width>36</width> |
||||
|
<height>36</height> |
||||
|
</size> |
||||
|
</property> |
||||
|
<property name="maximumSize"> |
||||
|
<size> |
||||
|
<width>36</width> |
||||
|
<height>36</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="btnMin_2"> |
||||
|
<property name="enabled"> |
||||
|
<bool>false</bool> |
||||
|
</property> |
||||
|
<property name="minimumSize"> |
||||
|
<size> |
||||
|
<width>30</width> |
||||
|
<height>36</height> |
||||
|
</size> |
||||
|
</property> |
||||
|
<property name="maximumSize"> |
||||
|
<size> |
||||
|
<width>30</width> |
||||
|
<height>36</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>36</width> |
||||
|
<height>36</height> |
||||
|
</size> |
||||
|
</property> |
||||
|
<property name="maximumSize"> |
||||
|
<size> |
||||
|
<width>36</width> |
||||
|
<height>36</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="btnMin_3"> |
||||
|
<property name="enabled"> |
||||
|
<bool>false</bool> |
||||
|
</property> |
||||
|
<property name="minimumSize"> |
||||
|
<size> |
||||
|
<width>30</width> |
||||
|
<height>36</height> |
||||
|
</size> |
||||
|
</property> |
||||
|
<property name="maximumSize"> |
||||
|
<size> |
||||
|
<width>30</width> |
||||
|
<height>36</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>36</width> |
||||
|
<height>36</height> |
||||
|
</size> |
||||
|
</property> |
||||
|
<property name="maximumSize"> |
||||
|
<size> |
||||
|
<width>36</width> |
||||
|
<height>36</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; |
||||
|
} |
||||
|
|
||||
|
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> |
||||
|
<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="QGridLayout" name="gridLayout_4"> |
||||
|
<item row="0" column="0"> |
||||
|
<widget class="QGroupBox" name="groupBox"> |
||||
|
<property name="layoutDirection"> |
||||
|
<enum>Qt::LeftToRight</enum> |
||||
|
</property> |
||||
|
<property name="title"> |
||||
|
<string>文件Md5计算</string> |
||||
|
</property> |
||||
|
<property name="alignment"> |
||||
|
<set>Qt::AlignCenter</set> |
||||
|
</property> |
||||
|
<layout class="QGridLayout" name="gridLayout"> |
||||
|
<item row="0" column="0"> |
||||
|
<widget class="QPushButton" name="btnSelectFile"> |
||||
|
<property name="text"> |
||||
|
<string>选择文件</string> |
||||
|
</property> |
||||
|
</widget> |
||||
|
</item> |
||||
|
<item row="0" column="1"> |
||||
|
<widget class="QLineEdit" name="leMd5Show"/> |
||||
|
</item> |
||||
|
</layout> |
||||
|
</widget> |
||||
|
</item> |
||||
|
<item row="1" column="0"> |
||||
|
<widget class="QGroupBox" name="groupBox_2"> |
||||
|
<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="btnSelectDir"> |
||||
|
<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"/> |
||||
|
</item> |
||||
|
<item> |
||||
|
<widget class="QListWidget" name="listWidget_2"/> |
||||
|
</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> |
||||
|
</item> |
||||
|
</layout> |
||||
|
</widget> |
||||
|
</item> |
||||
|
</layout> |
||||
|
</widget> |
||||
|
<resources/> |
||||
|
<connections/> |
||||
|
</ui> |
Loading…
Reference in new issue