#include "dialogfilecompare.h" #include "ui_dialogfilecompare.h" #include "FileCompare.h" #include DialogFileCompare::DialogFileCompare(QWidget *parent) : QDialog(parent), ui(new Ui::DialogFileCompare) { ui->setupUi(this); threadsFinished = true; QString dir = SNCDataBase::getExportDir(); if(dir.isEmpty()) { this->ui->exportDirEdit->setText(QDesktopServices::storageLocation(QDesktopServices::DesktopLocation)); } else { this->ui->exportDirEdit->setText(dir); } this->ui->exportDirEdit->setReadOnly(true); this->ui->primaryEdit->setReadOnly(true); this->ui->augEdit->setReadOnly(true); this->ui->lblProgress->setVisible(false); movie = new QMovie(":/working.gif"); this->ui->lblProgress->setMovie(movie); movie->start(); emptyModel = new NumberListModel(); } DialogFileCompare::~DialogFileCompare() { delete ui; delete movie; delete emptyModel; qDebug()<accept(); else { QMessageBox::information(this, tr("提示"),QString(tr("任务很快结束,请等待任务结束后再关闭本窗口!")),QMessageBox::Ok ); event->ignore(); } } void DialogFileCompare::on_primaryPB_clicked() { QString fileName = getOpenFileName(); if (!fileName.isEmpty()) { this->ui->primaryEdit->setText(fileName); } } void DialogFileCompare::on_augPB_clicked() { QString fileName = getOpenFileName(); if (!fileName.isEmpty()) { this->ui->augEdit->setText(fileName); } } void DialogFileCompare::on_addFilePB_clicked() { QStringList files = getOpenFileNames(); for(int i=0;ilistWidget1->addItem(item); } } void DialogFileCompare::on_delFilePB_clicked() { QList itemList = ui->listWidget1->selectedItems(); QListIterator it( itemList ); while (it.hasNext() ) { QListWidgetItem *item = it.next(); int row = ui->listWidget1->row( item ); ui->listWidget1->takeItem(row); } } void DialogFileCompare::on_export2PB_clicked() { if(!checkThreadFinished()) return ; if(!checkFileName()) return ; this->fileNames.clear(); fileNames<primaryEdit->text()<augEdit->text(); if(!checkCurrentSystemAvailable(fileNames)) return ; this->stepFetchFileProgress = 60; this->stepCompareProgress = 40; this->ui->lblProgress->setVisible(true); allocateFetchProgress(); fetchFile(); compareFile(Export2File); } void DialogFileCompare::on_export3PB_clicked() { if(!checkThreadFinished()) return ; if(!checkFileName()) return ; this->fileNames.clear(); fileNames<primaryEdit->text()<augEdit->text(); if(!checkCurrentSystemAvailable(fileNames)) return ; this->stepFetchFileProgress = 60; this->stepCompareProgress = 40; this->ui->lblProgress->setVisible(true); allocateFetchProgress(); fetchFile();//这里虽然是线程在执行,但要同步等待所有的线程结束后,才能进行文件比较 compareFile(Export3File); } void DialogFileCompare::fetchFile() { for(int i=0;iclear(); delete modelList[i]; } } modelList.clear(); this->filesFetced = 0; for(int i=0;isetFetchList(files); proxy->setBuildType(NumberFromFileImport); QObject::connect(proxy,SIGNAL(numberBuilt(NumberListModel*)),this,SLOT(onNumberBuilt(NumberListModel*))); QObject::connect(proxy,SIGNAL(progressMaxUpdated(int)),this,SLOT(onFetchFileProgressMaxUpdated(int))); QObject::connect(proxy,SIGNAL(progressUpdated(int)),this,SLOT(onFetchFileProgressUpdated(int))); proxy->start(); loop.exec();//等待 proxy->wait(); delete proxy; proxy = 0; } } void DialogFileCompare::onNumberBuilt(NumberListModel *model) { modelList.append(model); this->filesFetced++; loop.quit(); } void DialogFileCompare::compareFile(FileCompareType compareType) { FileCompare *compare = new FileCompare(fileNames,compareType); compare->setModel(this->modelList); compare->setExportDir(this->ui->exportDirEdit->text()); QObject::connect(compare,SIGNAL(progressUpdated(int)),this,SLOT(onCompareProgressUpdated(int))); QObject::connect(compare,SIGNAL(progressMaxUpdated(int)),this,SLOT(onCompareFileProgressMaxUpdated(int))); QObject::connect(compare,SIGNAL(fileCompared(QStringList)),this,SLOT(onFileCompared(QStringList))); compare->start(); loop.exec(); compare->wait(); delete compare; compare = 0; } void DialogFileCompare::onFileCompared(QStringList resultList) { loop.quit(); for(int i=0;ilistWidget2->addItem(item); } for(int i=0;iclear(); delete modelList[i]; } } modelList.clear(); this->ui->progressBar->setValue(0); this->ui->lblProgress->setVisible(false); threadsFinished = true; QMessageBox::information(this,"结果","文件比对完成。", QMessageBox::Ok); } void DialogFileCompare::on_integrationPB_clicked() { if(!checkThreadFinished()) return ; this->fileNames.clear(); for(int i=0;ilistWidget1->count();i++) { fileNames<listWidget1->item(i)->text(); } if(fileNames.isEmpty()) { threadsFinished = true ; return ; } if(!checkCurrentSystemAvailable(fileNames)) return ; this->stepFetchFileProgress = 70; this->stepIntegrateProgress = 30; this->ui->lblProgress->setVisible(true); integrateFile(); FileCompare *compare = new FileCompare(fileNames,IntegrateFile); compare->setModel(this->modelList); compare->setExportDir(this->ui->exportDirEdit->text()); QObject::connect(compare,SIGNAL(progressUpdated(int)),this,SLOT(onCompareProgressUpdated(int))); QObject::connect(compare,SIGNAL(progressMaxUpdated(int)),this,SLOT(onCompareFileProgressMaxUpdated(int))); QObject::connect(compare,SIGNAL(fileIntegrated(QStringList)),this,SLOT(onFileIntegrated(QStringList))); compare->start(); loop.exec(); compare->wait(); delete compare; compare = 0; } void DialogFileCompare::integrateFile() { for(int i=0;iclear(); delete modelList[i]; } } modelList.clear(); this->filesFetced = 0; ImportProxy *proxy = new ImportProxy(emptyModel); proxy->setFetchList(fileNames); proxy->setBuildType(NumberFromFileImport); QObject::connect(proxy,SIGNAL(numberBuilt(NumberListModel*)),this,SLOT(onNumberBuilt(NumberListModel*))); QObject::connect(proxy,SIGNAL(progressMaxUpdated(int)),this,SLOT(onProgressMaxUpdated(int))); QObject::connect(proxy,SIGNAL(progressUpdated(int)),this,SLOT(onProgressUpdated(int))); proxy->start(); loop.exec(); proxy->wait(); delete proxy; proxy = 0; } void DialogFileCompare::onFileIntegrated(QStringList resultList) { loop.quit(); for(int i=0;ilistWidget2->addItem(item); } for(int i=0;iclear(); delete modelList[i]; } } modelList.clear(); threadsFinished = true; this->ui->progressBar->setValue(0); this->ui->lblProgress->setVisible(false); QMessageBox::information(this,"结果","文件整合完成!", QMessageBox::Ok); } QStringList DialogFileCompare::getOpenFileNames() { QFileDialog::Options options; QString selectedFilter; QString dir = SNCDataBase::getImportDir(); if(dir.isEmpty()) { dir = QDesktopServices::storageLocation(QDesktopServices::DesktopLocation); } QStringList files; files = QFileDialog::getOpenFileNames(this,"打开",dir, tr("Text Files (*.txt)"),&selectedFilter,options); if(!files.isEmpty()) { QFileInfo fileInfo(files.at(0)); dir = fileInfo.absolutePath(); SNCDataBase::updateImportDir(dir); } return files; } bool DialogFileCompare::checkThreadFinished() { if(!threadsFinished) { QMessageBox::information(this,"提示","当前任务暂未结束,请等待当前任务结束后再执行下一操作", QMessageBox::Ok); return false; } threadsFinished = false; return true; } bool DialogFileCompare::checkFileName() { if(ui->primaryEdit->text().isEmpty()|| ui->augEdit->text().isEmpty()) { QMessageBox::critical(this,"提示","要比较的文件不能为空!",QMessageBox::Ok); threadsFinished = true; return false ; } if(ui->primaryEdit->text()==ui->augEdit->text()) { QMessageBox::critical(this,"提示","要比较的文件必须是不同的文件!",QMessageBox::Ok); threadsFinished = true; return false ; } return true; } void DialogFileCompare::on_joinButton_clicked() { if(!checkThreadFinished()) return ; QList itemList = ui->listWidget2->selectedItems(); QStringList files; for(int i=0;itext()); } if(files.isEmpty()) { threadsFinished = true ; return ; } if(!checkCurrentSystemAvailable(files)) return ; emit joinSource(files); threadsFinished = true; this->close(); } bool DialogFileCompare::checkCurrentSystemAvailable(QStringList files) { int count=0; int all_files_size=0; for(int i=0;i1500) { threadsFinished = true; QMessageBox::critical(this,"提示","您要处理的号码已经超过系统处理能力!",QMessageBox::Ok); return false; } else { return true; } } void DialogFileCompare::setAvailableCount(int count) { this->avaiableCount = count; } void DialogFileCompare::onProgressUpdated(int current) { this->ui->progressBar->setValue(current); } void DialogFileCompare::onProgressMaxUpdated(int max) { this->ui->progressBar->setMaximum(max); this->ui->progressBar->setMinimum(0); this->ui->progressBar->setValue(0); } void DialogFileCompare::onCompareFileProgressMaxUpdated(int max) { this->compareProgressMax = max; } void DialogFileCompare::onCompareProgressUpdated(int current) { double s1 = current; double s2 = this->compareProgressMax; this->ui->progressBar->setValue(this->stepFetchFileProgress + this->stepCompareProgress * s1/s2); } void DialogFileCompare::onIntegrateFileProgressMaxUpdated(int max) { this->integrateProgressMax = max; } void DialogFileCompare::onIntegrateProgressUpdated(int current) { double s1 = current; double s2 = this->integrateProgressMax; this->ui->progressBar->setValue(this->stepFetchFileProgress + this->stepIntegrateProgress * s1/s2); } void DialogFileCompare::onImportFileProgressMaxUpdated(int max) { this->fetchFileProgressMax = max; } void DialogFileCompare::onImportFileProgressUpdated(int current) { double s1 = current; double s2 = this->fetchFileProgressMax; this->ui->progressBar->setValue(this->stepFetchFileProgress * s1/s2); } void DialogFileCompare::onFetchFileProgressMaxUpdated(int max) { this->current_file_max = max; } void DialogFileCompare::onFetchFileProgressUpdated(int current) { int last_file_progress = 0; for(int i=0;ifilesFetced;i++) { last_file_progress += fetchProgress[i]; } double s1 = current; double s2 = this->current_file_max; this->ui->progressBar->setValue(last_file_progress+fetchProgress[filesFetced]*s1/s2); } void DialogFileCompare::allocateFetchProgress() { double total_file_size = 0; fetchProgress.clear(); for(int i=0;ifileNames.at(i)); double cur_file_size = fileinfo.size(); total_file_size += cur_file_size; } for(int i=0;ifileNames.at(i)); double cur_file_size = fileinfo.size(); fetchProgress.append(this->stepFetchFileProgress*cur_file_size/total_file_size); } } void DialogFileCompare::on_setDirPB_clicked() { QFileDialog::Options options = QFileDialog::ShowDirsOnly; QString dir; dir = QFileDialog::getExistingDirectory(this,"设定目录",this->ui->exportDirEdit->text(),options); if(!dir.isEmpty()) { this->ui->exportDirEdit->setText(dir); SNCDataBase::updateExportDir(dir); } } QString DialogFileCompare::getSaveFileName() { QFileDialog::Options options; QString selectedFilter; QString dir = SNCDataBase::getExportDir(); if(dir.isEmpty()) { dir = QDesktopServices::storageLocation(QDesktopServices::DesktopLocation); } QString fileName = QFileDialog::getSaveFileName(this, tr("保存"),dir, tr("Text Files (*.txt)"), &selectedFilter, options); if(!fileName.isEmpty()) { QFileInfo fileInfo(fileName); dir = fileInfo.absolutePath(); SNCDataBase::updateExportDir(dir); } return fileName; } QString DialogFileCompare::getOpenFileName() { QFileDialog::Options options; QString selectedFilter; QString dir = SNCDataBase::getImportDir(); if(dir.isEmpty()) { dir = QDesktopServices::storageLocation(QDesktopServices::DesktopLocation); } QString fileName = QFileDialog::getOpenFileName(this, tr("打开"),dir, tr("Text Files (*.txt)"), &selectedFilter, options); if(!fileName.isEmpty()) { QFileInfo fileInfo(fileName); dir = fileInfo.absolutePath(); SNCDataBase::updateImportDir(dir); } return fileName; }