#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include QString global_status = "空闲"; QString get_file_size_string(double file_size) { const char* units[] = {"B", "KB", "MB", "GB", "TB", "PB"}; double size = static_cast(file_size); long long unsigned int i = 0; while (size >= 1024 && i < (sizeof(units) / sizeof(units[0]) - 1)) { size /= 1024; ++i; } return QString("%1 %2").arg(size).arg(units[i]); } void MainWindow::resizeEvent(QResizeEvent *event) { adjustColumnSize(); } double getProcess(){ auto cursor = process.begin(); int total = 0; double process_percent = 0; while(cursor!=process.end()){ total++; double single = (cursor->second["crc32"]+ cursor->second["md4"]+ cursor->second["md5"]+ cursor->second["sha1"]+ cursor->second["sha256"]+ cursor->second["sha384"]+ cursor->second["sha512"])*1.0 / (calc_number) * 100; process_percent += single; cursor ++; } return process_percent / total; } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); this->setAcceptDrops(true); QLabel * status = new QLabel(); ui->statusbar->insertWidget(0,status); QLabel * calc_process = new QLabel(); ui->statusbar->insertWidget(1,calc_process); QTimer * kernel = new QTimer(); kernel->start(500); connect(kernel,&QTimer::timeout,[=](){ double p = getProcess(); if(int(p)==100){ global_status = "已完成"; process.clear(); } status->setText("状态: " + global_status); if(global_status == "已完成" || global_status == "空闲" ){ calc_process->setText("队列进度: 100%" ); }else{ calc_process->setText("队列进度: " + QString("%1%").arg(p)); } }); } MainWindow::~MainWindow() { delete ui; } void MainWindow::dragEnterEvent(QDragEnterEvent *e) { e->acceptProposedAction(); } auto MainWindow::gen_obj(QString text){ auto obj = new QLineEdit(); obj->setText(text); obj->setReadOnly(true); obj->setStyleSheet("QLineEdit{border:0px solid gray;}QLineEdit:focus {border-width:2px;border-color:rgb(170, 170, 255);background:rgba(69, 63, 45, 255);}"); // QGraphicsDropShadowEffect *shadow_effect = new QGraphicsDropShadowEffect(this); // shadow_effect->setOffset(0, 0); // shadow_effect->setColor(Qt::red); // shadow_effect->setBlurRadius(20); // obj->setGraphicsEffect(shadow_effect); return obj; } void MainWindow::open_comp_window(int type, int curr_row){ auto cursor = process.begin(); while(cursor!=process.end()){ if(cursor->first == QString("%1%2").arg(ui->tableWidget->item(curr_row,4)->text()).arg(curr_row)){ double single = (cursor->second["crc32"]+ cursor->second["md4"]+ cursor->second["md5"]+ cursor->second["sha1"]+ cursor->second["sha256"]+ cursor->second["sha384"]+ cursor->second["sha512"])* 1.0 / (calc_number) * 100; if(single != 100){ QMessageBox::warning(this,"稍等片刻","数据尚未计算完毕,请稍后再试"); return; } } cursor++; } comp_window *comp_win = new comp_window(); connect(this, &MainWindow::send_hash_info,comp_win, &comp_window::set_hash_info); emit send_hash_info(ui->tableWidget->item(curr_row,2)->text(), "file_name"); emit send_hash_info(ui->tableWidget->item(curr_row,3)->text(), "file_size"); emit send_hash_info(ui->tableWidget->item(curr_row,4)->text(), "file_path"); emit send_hash_info(ui->tableWidget->item(curr_row,5)->text(), "CRC32"); emit send_hash_info(ui->tableWidget->item(curr_row,6)->text(), "MD4"); emit send_hash_info(ui->tableWidget->item(curr_row,7)->text(), "MD5"); emit send_hash_info(ui->tableWidget->item(curr_row,8)->text(), "SHA1"); emit send_hash_info(ui->tableWidget->item(curr_row,9)->text(), "SHA256"); emit send_hash_info(ui->tableWidget->item(curr_row,10)->text(), "SHA384"); emit send_hash_info(ui->tableWidget->item(curr_row,11)->text(), "SHA512"); if(type==1){ emit send_hash_info("对比", "type"); } else if (type == 2){ emit send_hash_info("查看", "type"); } comp_win->show(); } void MainWindow::Calculate(QString path){ global_status = "正在计算"; QFileInfo fileInfo(path); int rowCount = ui->tableWidget->rowCount(); ui->tableWidget->insertRow(rowCount); QHBoxLayout *layout = new QHBoxLayout(); auto * show_btn = new QPushButton(); show_btn->setText("查看" ); auto * comp_btn = new QPushButton(); comp_btn->setText("比较"); layout->insertWidget(0, comp_btn); layout->insertWidget(0, show_btn); connect(comp_btn, &QPushButton::clicked,this, [&]() { QObject * obj = sender()->parent(); QTableWidgetItem * item = (QTableWidgetItem *)obj; QWidget * widget = (QWidget *)item; int x = widget->frameGeometry().x(); int y = widget->frameGeometry().y(); QModelIndex modelIndex = ui->tableWidget->indexAt(QPoint(x, y)); int curr_row = modelIndex.row(); int column = modelIndex.column(); open_comp_window(1,curr_row); }); connect(show_btn, &QPushButton::clicked,this, [&]() { QObject * obj = sender()->parent(); QTableWidgetItem * item = (QTableWidgetItem *)obj; QWidget * widget = (QWidget *)item; int x = widget->frameGeometry().x(); int y = widget->frameGeometry().y(); QModelIndex modelIndex = ui->tableWidget->indexAt(QPoint(x, y)); int curr_row = modelIndex.row(); int column = modelIndex.column(); open_comp_window(2,curr_row); }); layout->setContentsMargins(0,0,0,0); QWidget *widget = new QWidget(); widget->setLayout(layout); ui->tableWidget->setItem(rowCount, 0, new QTableWidgetItem("")); ui->tableWidget->setCellWidget(rowCount, 0,widget ); ui->tableWidget->setItem(rowCount, 1, new QTableWidgetItem(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))); ui->tableWidget->setCellWidget(rowCount, 1, gen_obj(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))); ui->tableWidget->setItem(rowCount, 2, new QTableWidgetItem(fileInfo.fileName())); ui->tableWidget->setCellWidget(rowCount, 2, gen_obj(fileInfo.fileName())); ui->tableWidget->setItem(rowCount, 3, new QTableWidgetItem(get_file_size_string(fileInfo.size()))); ui->tableWidget->setCellWidget(rowCount, 3, gen_obj(get_file_size_string(fileInfo.size()))); ui->tableWidget->setItem(rowCount, 4, new QTableWidgetItem(fileInfo.filePath())); ui->tableWidget->setCellWidget(rowCount, 4, gen_obj(fileInfo.filePath())); adjustColumnSize(); if(ui->checkBox_CRC32->isChecked()){ QFuture future = QtConcurrent::run(GetCRC32, path,rowCount); QFutureWatcher *m_watcher = new QFutureWatcher(this); m_watcher = new QFutureWatcher(this); m_watcher->setFuture(future); connect(m_watcher, &QFutureWatcher::finished, this, [=](){ auto item = new QTableWidgetItem(future.result()); this->ui->tableWidget->setItem(rowCount, 5, item); ui->tableWidget->setCellWidget(rowCount, 5, gen_obj(future.result())); adjustColumnSize(); }); }else{ process[QString("%1%2").arg(path).arg(rowCount)]["crc32"] = 1; this->ui->tableWidget->setItem(rowCount, 5, new QTableWidgetItem("---")); ui->tableWidget->setCellWidget(rowCount, 5, gen_obj("---")); } if(ui->checkBox_MD4->isChecked()){ QFuture future = QtConcurrent::run(GetMD4, path,rowCount); QFutureWatcher *m_watcher = new QFutureWatcher(this); m_watcher = new QFutureWatcher(this); m_watcher->setFuture(future); connect(m_watcher, &QFutureWatcher::finished, this, [=](){ this->ui->tableWidget->setItem(rowCount, 6, new QTableWidgetItem(future.result())); ui->tableWidget->setCellWidget(rowCount, 6, gen_obj(future.result())); adjustColumnSize(); }); }else{ process[QString("%1%2").arg(path).arg(rowCount)]["md4"] = 1; this->ui->tableWidget->setItem(rowCount, 6, new QTableWidgetItem("---")); ui->tableWidget->setCellWidget(rowCount, 6, gen_obj("---")); } if(ui->checkBox_MD5->isChecked()){ QFuture future = QtConcurrent::run(GetMD5, path,rowCount); QFutureWatcher *m_watcher = new QFutureWatcher(this); m_watcher = new QFutureWatcher(this); m_watcher->setFuture(future); connect(m_watcher, &QFutureWatcher::finished, this, [=](){ this->ui->tableWidget->setItem(rowCount, 7, new QTableWidgetItem(future.result())); ui->tableWidget->setCellWidget(rowCount, 7, gen_obj(future.result())); adjustColumnSize(); }); }else{ process[QString("%1%2").arg(path).arg(rowCount)]["md5"] = 1; this->ui->tableWidget->setItem(rowCount, 7, new QTableWidgetItem("---")); ui->tableWidget->setCellWidget(rowCount, 7, gen_obj("---")); } if(ui->checkBox_SHA1->isChecked()){ QFuture future = QtConcurrent::run(GetSHA1, path,rowCount); QFutureWatcher *m_watcher = new QFutureWatcher(this); m_watcher = new QFutureWatcher(this); m_watcher->setFuture(future); connect(m_watcher, &QFutureWatcher::finished, this, [=](){ this->ui->tableWidget->setItem(rowCount, 8, new QTableWidgetItem(future.result())); ui->tableWidget->setCellWidget(rowCount, 8, gen_obj(future.result())); adjustColumnSize(); }); }else{ process[QString("%1%2").arg(path).arg(rowCount)]["sha1"] = 1; this->ui->tableWidget->setItem(rowCount, 8, new QTableWidgetItem("---")); ui->tableWidget->setCellWidget(rowCount, 8, gen_obj("---")); } if(ui->checkBox_SHA256->isChecked()){ QFuture future = QtConcurrent::run(GetSHA256, path,rowCount); QFutureWatcher *m_watcher = new QFutureWatcher(this); m_watcher = new QFutureWatcher(this); m_watcher->setFuture(future); connect(m_watcher, &QFutureWatcher::finished, this, [=](){ this->ui->tableWidget->setItem(rowCount, 9, new QTableWidgetItem(future.result())); ui->tableWidget->setCellWidget(rowCount, 9, gen_obj(future.result())); adjustColumnSize(); }); }else{ process[QString("%1%2").arg(path).arg(rowCount)]["sha256"] = 1; this->ui->tableWidget->setItem(rowCount, 9, new QTableWidgetItem("---")); ui->tableWidget->setCellWidget(rowCount, 9, gen_obj("---")); } if(ui->checkBox_SHA384->isChecked()){ QFuture future = QtConcurrent::run(GetSHA384, path,rowCount); QFutureWatcher *m_watcher = new QFutureWatcher(this); m_watcher = new QFutureWatcher(this); m_watcher->setFuture(future); connect(m_watcher, &QFutureWatcher::finished, this, [=](){ this->ui->tableWidget->setItem(rowCount, 10, new QTableWidgetItem(future.result())); ui->tableWidget->setCellWidget(rowCount, 10, gen_obj(future.result())); adjustColumnSize(); }); }else{ process[QString("%1%2").arg(path).arg(rowCount)]["sha384"] = 1; this->ui->tableWidget->setItem(rowCount, 10, new QTableWidgetItem("---")); ui->tableWidget->setCellWidget(rowCount, 10, gen_obj("---")); } if(ui->checkBox_SHA512->isChecked()){ QFuture future = QtConcurrent::run(GetSHA512, path, rowCount); QFutureWatcher *m_watcher = new QFutureWatcher(this); m_watcher = new QFutureWatcher(this); m_watcher->setFuture(future); connect(m_watcher, &QFutureWatcher::finished, this, [=](){ this->ui->tableWidget->setItem(rowCount, 11, new QTableWidgetItem(future.result())); ui->tableWidget->setCellWidget(rowCount, 11, gen_obj(future.result())); adjustColumnSize(); }); }else{ process[QString("%1%2").arg(path).arg(rowCount)]["sha512"] = 1; this->ui->tableWidget->setItem(rowCount, 11, new QTableWidgetItem("---")); ui->tableWidget->setCellWidget(rowCount, 11, gen_obj("---")); } } void MainWindow::dropEvent(QDropEvent *e) { QList urls = e->mimeData()->urls(); if(urls.isEmpty()) return ; foreach (QUrl u, urls) { QString filepath = u.toLocalFile(); pathlist.append(filepath); } for(int i=0;itableWidget->setSelectionMode(QAbstractItemView::SingleSelection); ui->tableWidget->horizontalHeader()->setStretchLastSection(true); } void MainWindow::columnSwitcher(int id, int flag){ if(flag==2) ui->tableWidget->showColumn(id+4); else ui->tableWidget->hideColumn(id+4); } void MainWindow::on_checkBox_SHA512_stateChanged(int arg1) { columnSwitcher(7,arg1); } void MainWindow::on_checkBox_SHA384_stateChanged(int arg1) { columnSwitcher(6,arg1); } void MainWindow::on_checkBox_SHA256_stateChanged(int arg1) { columnSwitcher(5,arg1); } void MainWindow::on_checkBox_SHA1_stateChanged(int arg1) { columnSwitcher(4,arg1); } void MainWindow::on_checkBox_MD5_stateChanged(int arg1) { columnSwitcher(3,arg1); } void MainWindow::on_checkBox_MD4_stateChanged(int arg1) { columnSwitcher(2,arg1); } void MainWindow::on_checkBox_CRC32_stateChanged(int arg1) { columnSwitcher(1,arg1); } void MainWindow::on_checkBox_calc_time_stateChanged(int arg1) { columnSwitcher(-3,arg1); } void MainWindow::on_checkBox_file_name_stateChanged(int arg1) { columnSwitcher(-2,arg1); } void MainWindow::on_checkBox_file_size_stateChanged(int arg1) { columnSwitcher(-1,arg1); } void MainWindow::on_checkBox_file_path_stateChanged(int arg1) { columnSwitcher(0,arg1); }