diff --git a/src/Combinear.css b/src/Combinear.css index 5f3eb74..9f0d7f0 100644 --- a/src/Combinear.css +++ b/src/Combinear.css @@ -263,4 +263,20 @@ MPRResliceWindow#MPRWin{ QSplitter::handle { background: #5a5a5a; +} + +QProgressBar{ + min-height: 10px; + max-height: 10px; + border:1px solid #aaa; + /* border-radius: 4px; */ + text-align: center; + margin-top: 4px; + margin-left: 3px; +} +QProgressBar::chunk { + background: QLinearGradient( x1: 0, y1: 0, + x2: 1, y2: 0, + stop: 0 #ffffff, + stop: 1 #666666 ); } \ No newline at end of file diff --git a/src/src/Events/EventsCenter.h b/src/src/Events/EventsCenter.h index 62c781a..cbb2464 100644 --- a/src/src/Events/EventsCenter.h +++ b/src/src/Events/EventsCenter.h @@ -9,6 +9,7 @@ #define aLLEventMacro() \ _add_Event(DefaultEvent)\ + _add_Event(LoadProgressEvent)\ _add_Event(SyncStateChanged)\ _add_Event(AnnotationStateChanged)\ _add_Event(AnonymizeStateChanged)\ diff --git a/src/src/IO/DICOM/DICOMHeaderHelper.cpp b/src/src/IO/DICOM/DICOMHeaderHelper.cpp index 1a44922..16b19c3 100644 --- a/src/src/IO/DICOM/DICOMHeaderHelper.cpp +++ b/src/src/IO/DICOM/DICOMHeaderHelper.cpp @@ -4,16 +4,21 @@ #include "dcmtk/dcmdata/dcdeftag.h" #include "dcmtk/dcmdata/dcdatset.h" #include "dcmtk/dcmdata/dcspchrs.h" -#include "ExtendMedicalImageProperties.h" #include #include -#include -#include -#include -#include #include +#include +#include +#include +#include +#include + +#include "ExtendMedicalImageProperties.h" + + void DICOMHeaderHelper::Update() { + CalculateResource(); ReadHeader(); ArrangeSeriesProperty(); SeriesCount = seriesProperties.size(); @@ -33,6 +38,12 @@ ExtendMedicalImageProperties *DICOMHeaderHelper::GetSeriesBySeriesUID(const char return nullptr; } +void DICOMHeaderHelper::SetProgressCallback(void (*aProgressCallback)(float)) +{ + if (!aProgressCallback) return; + mProgressCallback = aProgressCallback; +} + void DICOMHeaderHelper::Clear() { dirName.clear(); fileName.clear(); @@ -40,6 +51,18 @@ void DICOMHeaderHelper::Clear() { SeriesCount = 0; } +void DICOMHeaderHelper::CalculateResource() +{ + mFilesCount = 0; + mProcessedCount = 0; + QDirIterator it(dirName.data(), QDir::Files, QDirIterator::Subdirectories); + + while (it.hasNext()) { + it.next(); // 移动到下一个文件 + mFilesCount++; + } +} + void DICOMHeaderHelper::readHeaderFromDir(const char * rootPath){ QDir dir(QString::fromLocal8Bit(rootPath)); dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); @@ -241,6 +264,10 @@ void DICOMHeaderHelper::readHeaderFromFile(const char * filePath){ series[uniqueID].push_back(std::move(fileHeader)); } } + mProcessedCount++; + if (mProgressCallback){ + mProgressCallback(((float)mProcessedCount/(float)(mFilesCount))); + } } void DICOMHeaderHelper::ReadHeader() { diff --git a/src/src/IO/DICOM/DICOMHeaderHelper.h b/src/src/IO/DICOM/DICOMHeaderHelper.h index 0222cc6..75fda06 100644 --- a/src/src/IO/DICOM/DICOMHeaderHelper.h +++ b/src/src/IO/DICOM/DICOMHeaderHelper.h @@ -105,6 +105,8 @@ public: */ void Clear(); + void CalculateResource(); + /** * 进行文件检索和数据读取,并按照读取所得的内容生成ExtendMedicalImageProperties */ @@ -142,6 +144,8 @@ public: */ ExtendMedicalImageProperties *GetSeriesBySeriesUID(const char *seriesUID); + void SetProgressCallback(void (*aProgressCallback)(float)); + private: void ReadHeader(); @@ -154,9 +158,13 @@ private: ExtendMedicalImageProperties * createProperty(const std::vector &header, int splitIndex, int beginOffset); + void (*mProgressCallback)(float aPercent) = nullptr; + std::string dirName; std::string fileName; int SeriesCount = 0; + int mFilesCount = 0; + int mProcessedCount = 0; SeriesFileMap series; std::vector seriesProperties; }; diff --git a/src/src/IO/DICOM/DicomLoader.cpp b/src/src/IO/DICOM/DicomLoader.cpp index bae0371..a60dc3b 100644 --- a/src/src/IO/DICOM/DicomLoader.cpp +++ b/src/src/IO/DICOM/DicomLoader.cpp @@ -6,12 +6,21 @@ #include "DICOMHeaderHelper.h" #include "DICOMPixelDataHelper.h" #include "vtkDCMTKImageReader.h" +#include "Events/EventsCenter.h" +void raiseReadPropertyProgress(float aPercent) +{ + EventObject eventObj; + eventObj.AddDetailValue("progress",aPercent); + EventsCenter::Default()->TriggerEvent(LoadProgressEvent, &eventObj); +} + void DicomLoader::readPropertiesFromDir(const std::string &dir, std::vector& properties, int& count) { DICOMHeaderHelper DICOMHelper; DICOMHelper.SetDirName(dir.c_str()); + DICOMHelper.SetProgressCallback(raiseReadPropertyProgress); DICOMHelper.Update(); count = DICOMHelper.GetSeriesCount(); if ( DICOMHelper.GetSeriesCount()>0){ diff --git a/src/src/UI/Window/QDicomViewer.cpp b/src/src/UI/Window/QDicomViewer.cpp index 1f336a9..0e6efbb 100644 --- a/src/src/UI/Window/QDicomViewer.cpp +++ b/src/src/UI/Window/QDicomViewer.cpp @@ -8,6 +8,9 @@ #include #include +#include +#include + #include "Common/Helper/OrientationHelper.h" #include "Common/ImageSetStore.h" @@ -47,6 +50,11 @@ QDicomViewer::QDicomViewer(QWidget *parent) : QMainWindow(parent), //TODO:目前为方向是写死的正交方向 OrientationHelper::init(); + QHBoxLayout* layout = new QHBoxLayout(ui->statusBar); + mProgress = new QProgressBar(ui->statusBar) ; + mProgress->setObjectName("progress"); + layout->addWidget(mProgress); + mProgress->hide(); } QDicomViewer::~QDicomViewer() { @@ -94,6 +102,8 @@ void QDicomViewer::SetupConnections() { connect(ui->toolBar, &QToolBar::visibilityChanged, this, &QDicomViewer::Slot_ToolbarVisibilityChanged); + + connect(EventsCenter::Default(),&EventsCenter::LoadProgressEvent, this, &QDicomViewer::loadProgress); } //视窗操作,播放相关 @@ -331,10 +341,26 @@ void QDicomViewer::openDICOMFromPACS(int err, std::string dirName) { void QDicomViewer::changeColorTable(const QString& aTable) { - DicomImageView *curV = ui->viewContainer->getViewManager()->getCurrentView(); - if (curV != nullptr && curV->hasSeries()) { - curV->setColorTable(aTable); - } + DicomImageView *curV = ui->viewContainer->getViewManager()->getCurrentView(); + if (curV != nullptr && curV->hasSeries()) { + curV->setColorTable(aTable); + } +} + +void QDicomViewer::loadProgress(EventObject *aCalldata) +{ + float value = aCalldata->Detail["progress"].toFloat(); + if (value>=1){ + mProgress->setValue(100); + this->update(); + ui->statusBar->showMessage(tr("Ready")); + mProgress->setVisible(false); + } + else{ + ui->statusBar->showMessage(""); + mProgress->setVisible(true); + mProgress->setValue(round(value*100)); + } } //TODO: 覆盖逻辑和增加逻辑待补充 diff --git a/src/src/UI/Window/QDicomViewer.h b/src/src/UI/Window/QDicomViewer.h index df6d1ab..aacf549 100644 --- a/src/src/UI/Window/QDicomViewer.h +++ b/src/src/UI/Window/QDicomViewer.h @@ -28,6 +28,7 @@ public slots: void Slot_ToolbarVisibilityChanged(bool); void openDICOMFromPACS(int,std::string); void changeColorTable(const QString& aTable); + void loadProgress(EventObject* aCalldata); private: Ui::QDicomViewerClass *ui; @@ -86,6 +87,7 @@ private: ExportDialog *exportDialog = nullptr; + QProgressBar* mProgress = nullptr; ImportWidget *m_import =nullptr; QSettings m_qs; Customwindow *m_customwin =nullptr;