Fix view[0] repeat connect slots bug.

This commit is contained in:
Krad
2022-07-25 16:15:14 +08:00
parent 169e0ea2a2
commit 5a1d95a4f4
3 changed files with 85 additions and 45 deletions

View File

@@ -35,16 +35,23 @@ void ImageViewManager::add(DicomImageView *view) {
connect(view, &DicomImageView::onViewDoubleClick,
this, &ImageViewManager::viewDoubleClicked);
connect(view, &DicomImageView::afterViewCleared,this, &ImageViewManager::viewCleared);
connect(view, &DicomImageView::afterViewCleared,
this, &ImageViewManager::viewCleared);
connect(view, &DicomImageView::onDragDrop, [=](DicomImageView *view, const std::string &id) {
setCurrentView(view);
viewReload(id);
});
connect(view, &DicomImageView::onSync,
this, &ImageViewManager::viewSynced);
// connect(view, &DicomImageView::onSync,
// this, &ImageViewManager::viewSynced);
connect(view, &DicomImageView::onEndPan,
this, &ImageViewManager::viewPaned);
connect(view, &DicomImageView::onEndZoom,
this, &ImageViewManager::viewZoomed);
connect(view, &DicomImageView::onEndWindowLevel,
this, &ImageViewManager::viewEndWindowLeveL);
vList.push_back(view);
}
}
@@ -58,9 +65,26 @@ void ImageViewManager::remove(DicomImageView *view) {
void ImageViewManager::remove(int idx) {
if (idx >= vList.size()) return;
auto view = vList.at(idx);
vList.removeOne(view);
delete view;
vList.takeAt(idx)->deleteLater();
}
DicomImageView * ImageViewManager::takeAt(int idx){
if (idx >= vList.size()) return nullptr;
auto view = vList.takeAt(idx);
disconnect(view, &DicomImageView::onViewClick,nullptr,nullptr);
disconnect(view, &DicomImageView::onViewDoubleClick,nullptr,nullptr);
disconnect(view, &DicomImageView::afterViewCleared,nullptr,nullptr);
disconnect(view, &DicomImageView::onDragDrop,nullptr,nullptr);
disconnect(view, &DicomImageView::onEndPan,nullptr,nullptr);
disconnect(view, &DicomImageView::onEndZoom,nullptr,nullptr);
disconnect(view, &DicomImageView::onEndWindowLevel,nullptr,nullptr);
return view;
}
void ImageViewManager::clear(){
while(!vList.isEmpty()){
vList.takeFirst()->deleteLater();
}
}
@@ -179,39 +203,51 @@ void ImageViewManager::viewSynced(DicomImageView *src, int interactionMode, void
}
break;
case VTKIS_IMAGE_PAN:
if (SyncHelper::getSyncItem(ZOOM_PAN)) {
this->smartDo([](auto v, auto callData) {
if (v->hasSeries()) {
double *d = (double *) callData;
double vector[3] = {d[3] - d[0], d[4] - d[1], d[5] - d[2]};
v->setPanOffset(vector);
}
}, src, data, ImageViewManager::EStudyEBoundsSeries);
}
}
void ImageViewManager::viewPaned(DicomImageView *src, void* offsetVector) {
if (SyncHelper::getSyncItem(ZOOM_PAN)) {
if (SyncHelper::getSyncState() == MANUAL_SYNC) {
this->smartDo([](auto v, auto callData) {
if (v->hasSeries()) {
double *d = (double *) callData;
double vector[3] = {d[3] - d[0], d[4] - d[1], d[5] - d[2]};
v->setPanOffset(vector);
}
}, src, offsetVector, ImageViewManager::EStudyEBoundsSeries);
} else if (SyncHelper::getSyncState() == AUTO_SYNC) {
this->smartDo([](auto v, auto callData) {
if (v->hasSeries()) {
double *d = (double *) callData;
double vector[3] = {d[3], d[4] , d[5]};
v->setPanFocalPoint(vector);
}
}, src, offsetVector, ImageViewManager::EStudyEBoundsSeries);
}
}
}
void ImageViewManager::viewZoomed(DicomImageView *src, double scaleFactor) {
if (SyncHelper::getSyncItem(ZOOM_PAN)) {
this->smartDo([](auto v, auto callData) {
if (v->hasSeries()) {
double d = *(double *) callData;
v->setZoomScale(d);
}
break;
case VTKIS_IMAGE_ZOOM:
if (SyncHelper::getSyncItem(ZOOM_PAN)) {
this->smartDo([](auto v, auto callData) {
if (v->hasSeries()) {
double *d = (double *) callData;
v->setZoomScale(d[1]);
}
}, src, data, ImageViewManager::EStudyEBoundsSeries);
}, src, &scaleFactor, ImageViewManager::EStudyEBoundsSeries);
}
}
void ImageViewManager::viewEndWindowLeveL(DicomImageView *src, double level, double window) {
double data[2] = {level, window};
if (SyncHelper::getSyncItem(WIDTH_LEVEL)) {
this->smartDo([](auto v, auto callData) {
if (v->hasSeries()) {
double *d = (double *) callData;
v->setWindowLevel(d[0], d[1]);
}
break;
case VTKIS_IMAGE_WINDOWLEVEL:
if (SyncHelper::getSyncItem(WIDTH_LEVEL)) {
this->smartDo([](auto v, auto callData) {
if (v->hasSeries()) {
double *d = (double *) callData;
v->setWindowLevel(d[1], d[0]);
}
}, src, data, ImageViewManager::EStudyEBoundsSeries);
}
break;
default:
break;
}, src, data, ImageViewManager::EStudyEBoundsSeries);
}
}
@@ -313,3 +349,4 @@ void ImageViewManager::checkCurrentViewFusion() {
currentFusionView = nullptr;
emit fusionCheckStateChanged(false);
}

View File

@@ -30,11 +30,11 @@ public:
void remove(int idx);
void setCurrentView(DicomImageView *view);
DicomImageView * takeAt(int idx);
void clear() {
vList.clear();
}
void clear();
void setCurrentView(DicomImageView *view);
DicomImageView *getCurrentView() {
return currentView;
@@ -66,6 +66,12 @@ public:
void viewSynced(DicomImageView *src, int interactionMode, void *data);
void viewPaned(DicomImageView *src, void* offsetVector);
void viewZoomed(DicomImageView *src, double scaleFactor);
void viewEndWindowLeveL(DicomImageView *src, double level, double window);
void viewReload(const std::string &unique_info);
void viewCleared();

View File

@@ -95,10 +95,7 @@ void ViewContainerWidget::viewLayoutChanged(int col, int row) {
void ViewContainerWidget::resetLayoutToSingle() {
viewLayoutChanged(1, 1);
while (mViewManager->getViewCount() > 1) {
mViewManager->remove(1);
}
DicomImageView *v = mViewManager->getView(0);
DicomImageView *v = mViewManager->takeAt(0);
mViewManager->clear();
mViewManager->add(v);
mViewManager->setCurrentView(v);