Refactor dicomimageview. Change SyncScrollBar by use SetValueSilently function.

This commit is contained in:
Krad
2022-07-01 14:15:50 +08:00
parent 5e94261f17
commit 2c088c3bee
2 changed files with 442 additions and 434 deletions

View File

@@ -28,8 +28,8 @@ DicomImageView::DicomImageView(QWidget* parent)
QGridLayout *view_layout = new QGridLayout(this); QGridLayout *view_layout = new QGridLayout(this);
//add container and title bar //add container and title bar
_titleBar = createMyTitleBar(); mTitleBar = createMyTitleBar();
view_layout->addWidget(_titleBar, 0, 0); view_layout->addWidget(mTitleBar, 0, 0);
view_layout->addWidget(wrapper, 1, 0); view_layout->addWidget(wrapper, 1, 0);
view_layout->setContentsMargins(0, 0, 0, 0); view_layout->setContentsMargins(0, 0, 0, 0);
view_layout->setSpacing(0); view_layout->setSpacing(0);
@@ -37,20 +37,21 @@ DicomImageView::DicomImageView(QWidget* parent)
// create layout for main container // create layout for main container
QGridLayout* controlLayout = new QGridLayout(wrapper); QGridLayout* controlLayout = new QGridLayout(wrapper);
_glWidt = new QVTKOpenGLNativeWidget(wrapper); mGLWidget = new QVTKOpenGLNativeWidget(wrapper);
//add QVTKOpenGLNativeWidget to container //add QVTKOpenGLNativeWidget to container
m_glrenWin = vtkSmartPointer <vtkGenericOpenGLRenderWindow>::New(); mGLRenWin = vtkSmartPointer <vtkGenericOpenGLRenderWindow>::New();
_glWidt->SetRenderWindow(m_glrenWin);//set up interacte mGLWidget->SetRenderWindow(mGLRenWin);//set up interacte
controlLayout->addWidget(_glWidt, 0, 0); controlLayout->addWidget(mGLWidget, 0, 0);
//add scrollbar to container //add scrollbar to container
_scrollBar = new ClickableScrollBar(Qt::Orientation::Vertical, this); mScrollBar = new ClickableScrollBar(Qt::Orientation::Vertical, this);
_scrollBar->setFocusPolicy(Qt::StrongFocus); mScrollBar->setSingleStep(1);
_scrollBar->setVisible(false); mScrollBar->setFocusPolicy(Qt::StrongFocus);
_scrollBar->setObjectName("scrollbar"); mScrollBar->setVisible(false);
controlLayout->addWidget(_scrollBar, 0, 1); mScrollBar->setObjectName("scrollbar");
connect(_scrollBar, &ClickableScrollBar::clicked,this,&DicomImageView::viewerClicked); controlLayout->addWidget(mScrollBar, 0, 1);
connect(mScrollBar, &ClickableScrollBar::clicked, this, &DicomImageView::viewerClicked);
//config container UI //config container UI
controlLayout->setContentsMargins(0, 0, 0, 0); controlLayout->setContentsMargins(0, 0, 0, 0);
@@ -66,14 +67,14 @@ DicomImageView::DicomImageView(QWidget* parent)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
DicomImageView::~DicomImageView() DicomImageView::~DicomImageView()
{ {
if (_ImageViewer){ if (mImageViewer){
_ImageViewer->Delete(); mImageViewer->Delete();
_ImageViewer = nullptr; mImageViewer = nullptr;
} }
_thread.quit();//event loop mVcrControlThread.quit();//event loop
_thread.wait(); //wait until return,block mode mVcrControlThread.wait(); //wait until return,block mode
if (_vcr_toolbar){ if (mVcrToolbar){
_vcr_toolbar->deleteLater(); mVcrToolbar->deleteLater();
} }
} }
@@ -87,50 +88,23 @@ MyTitleBar * DicomImageView::createMyTitleBar()
void DicomImageView::initScrollbar() void DicomImageView::initScrollbar()
{ {
//_MinSlice = _ImageViewer->GetSliceMin(); //_MinSlice = mImageViewer->GetSliceMin();
//_MaxSlice = _ImageViewer->GetSliceMax(); //_MaxSlice = mImageViewer->GetSliceMax();
_scrollBar->setValue(_ImageViewer->GetSliceMin()); mScrollBar->setValue(mImageViewer->GetSliceMin());
_scrollBar->setMaximum(_ImageViewer->GetSliceMax()); mScrollBar->setMaximum(mImageViewer->GetSliceMax());
_scrollBar->setSingleStep(1); mScrollBar->setSingleStep(1);
_scrollBar->setVisible(true); mScrollBar->setVisible(true);
} }
//NOTE: not working //NOTE: not working
void DicomImageView::setHighlight(bool yes) { void DicomImageView::setHighlight(bool yes) {
_titleBar->SetHighlight(yes); mTitleBar->SetHighlight(yes);
} }
//SLOTS------------------------------------------------------------------------ //SLOTS------------------------------------------------------------------------
void DicomImageView::Slot_scrollValueChanged(int slice) void DicomImageView::Slot_scrollValueChanged(int slice)
{ {
//if the scroll bar is activated by user, emit mImageViewer->SetSlice(slice);
//if the scroll bar is activated by program, no emit
switch (_ScrollTriggerType)
{
case(scrollScope::TriggerType::USER_TRIGGER):
{
_ImageViewer->SetSlice(slice); //for interactor style use, reduce duplicate
// no break;
}
case(scrollScope::TriggerType::STYLE_TRIGGER):
{
qDebug()<<"======>>";
_ImageViewer->updateCornerInfo(TOP_LEFT);
//invoke event
double focusPoint[3] = {.0, .0, .0};
_ImageViewer->GetSlicePoint(focusPoint);
this->Signal_SyncEvent(this, VTKIS_IMAGE_SLICING, focusPoint);
break;
}
case(scrollScope::TriggerType::SYNC_ONLY):
{
_PrevSlice = slice;
break;
}
default:
break;
}
} }
void DicomImageView::Slot_ViewEmpty() void DicomImageView::Slot_ViewEmpty()
@@ -146,37 +120,37 @@ void DicomImageView::Slot_viewDoubleclicked()
void DicomImageView::Slot_WindowLevelEventForFusion(double level, double width) void DicomImageView::Slot_WindowLevelEventForFusion(double level, double width)
{ {
if (IsFusion()) { if (IsFusion()) {
_ImageViewer->SetFusionColorLeveL(level); mImageViewer->SetFusionColorLeveL(level);
_ImageViewer->SetFusionColorWindow(width); mImageViewer->SetFusionColorWindow(width);
_ImageViewer->Render(); mImageViewer->Render();
} }
} }
void DicomImageView::Slot_Transformation() void DicomImageView::Slot_Transformation()
{ {
_ImageViewer->updateOrienInfo(); mImageViewer->updateOrienInfo();
_ImageViewer->Render(); mImageViewer->Render();
} }
//Widget event---------------------------------------------------------------- //Widget event----------------------------------------------------------------
void DicomImageView::wheelEvent(QWheelEvent *event) void DicomImageView::wheelEvent(QWheelEvent *event)
{ {
if (HasSeries()) { if (HasSeries()) {
int _Slice = _ImageViewer->GetSlice(); int _Slice = mImageViewer->GetSlice();
int _MinSlice = _ImageViewer->GetSliceMin(); int _MinSlice = mImageViewer->GetSliceMin();
int _MaxSlice = _ImageViewer->GetSliceMax(); int _MaxSlice = mImageViewer->GetSliceMax();
if (event->delta() > 0) if (event->delta() > 0)
{ {
if (_Slice > _MinSlice) if (_Slice > _MinSlice)
{ {
_Slice -= 1; _Slice -= 1;
_scrollBar->setValue(_Slice); mImageViewer->SetSlice(_Slice);
} }
else else
{ {
_Slice = _MinSlice; _Slice = _MinSlice;
_scrollBar->setValue(_Slice); mImageViewer->SetSlice(_Slice);
} }
} }
else else
@@ -184,12 +158,12 @@ void DicomImageView::wheelEvent(QWheelEvent *event)
if (_Slice < _MaxSlice) if (_Slice < _MaxSlice)
{ {
_Slice += 1; _Slice += 1;
_scrollBar->setValue(_Slice); mImageViewer->SetSlice(_Slice);
} }
else else
{ {
_Slice = _MaxSlice; _Slice = _MaxSlice;
_scrollBar->setValue(_Slice); mImageViewer->SetSlice(_Slice);
} }
} }
} }
@@ -201,33 +175,19 @@ void DicomImageView::mousePressEvent(QMouseEvent* event)
emit Signal_ViewClicked(this); emit Signal_ViewClicked(this);
} }
/** // DND support-----------------------------------------------------------------
* @brief DicomImageView::dragEnterEvent
* 拖拽进入
* @param e
*/
void DicomImageView::dragEnterEvent(QDragEnterEvent *e) { void DicomImageView::dragEnterEvent(QDragEnterEvent *e) {
if (e->mimeData()->hasFormat("text/plain")) { if (e->mimeData()->hasFormat("text/plain")) {
e->acceptProposedAction(); e->acceptProposedAction();
} }
} }
/**
* @brief DicomImageView::dragMoveEvent
* 拖拽移动
* @param e
*/
void DicomImageView::dragMoveEvent(QDragMoveEvent *e) { void DicomImageView::dragMoveEvent(QDragMoveEvent *e) {
if (e->mimeData()->hasFormat("text/plain")) { if (e->mimeData()->hasFormat("text/plain")) {
e->acceptProposedAction(); e->acceptProposedAction();
} }
} }
/**
* @brief DicomImageView::dropEvent
* 拖拽松开
* @param e
*/
void DicomImageView::dropEvent(QDropEvent *e) { void DicomImageView::dropEvent(QDropEvent *e) {
if (e->mimeData()->hasFormat("text/plain")) { if (e->mimeData()->hasFormat("text/plain")) {
e->acceptProposedAction(); e->acceptProposedAction();
@@ -239,29 +199,25 @@ void DicomImageView::dropEvent(QDropEvent *e) {
} }
} }
/**
* @brief DicomImageView::dragLeaveEvent
* 离开事件
* @param e
*/
void DicomImageView::dragLeaveEvent(QDragLeaveEvent *) { void DicomImageView::dragLeaveEvent(QDragLeaveEvent *) {
return; return;
} }
// layout resize---------------------------------------------------------------
void DicomImageView::resizeEvent(QResizeEvent *event) void DicomImageView::resizeEvent(QResizeEvent *event)
{ {
//auto size conner info //auto size conner info
if (!_ImageViewer) return; if (!mImageViewer) return;
if (_ImageViewer->GetvtkCornerAnnotation()) { if (mImageViewer->GetvtkCornerAnnotation()) {
_ImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size())); mImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
_ImageViewer->Render(); mImageViewer->Render();
} }
if (isCine) { if (mIsCine) {
int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 + int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 +
VCRHelper::getVCRXOffset(); VCRHelper::getVCRXOffset();
int ay = (this->geometry().bottomLeft().y() + this->geometry().bottomRight().y()) / 2 + int ay = (this->geometry().bottomLeft().y() + this->geometry().bottomRight().y()) / 2 +
VCRHelper::getVCRYOffset(); VCRHelper::getVCRYOffset();
_vcr_toolbar->move(ax, ay); mVcrToolbar->move(ax, ay);
} }
} }
@@ -269,28 +225,28 @@ void DicomImageView::resizeEvent(QResizeEvent *event)
//Fusion about ------------------------------------------------------------- //Fusion about -------------------------------------------------------------
bool DicomImageView::IsFusion() bool DicomImageView::IsFusion()
{ {
return _ImageViewer->GetFusion(); return mImageViewer->GetFusion();
} }
void DicomImageView::SetFusionInput(DicomImageView *overlay) void DicomImageView::SetFusionInput(DicomImageView *overlay)
{ {
_overlay = overlay; mOverlayView = overlay;
vtkImageData *overlay_data = _overlay->getSeriesInstance()->GetData(); vtkImageData *overlay_data = mOverlayView->getSeriesInstance()->GetData();
double window; double window;
double level; double level;
_overlay->GetWindowLevel(level, window); mOverlayView->GetWindowLevel(level, window);
_ImageViewer->FusionOn(); mImageViewer->FusionOn();
_overlay->OverlayOn(); mOverlayView->OverlayOn();
_overlay->SetBaseView(this); mOverlayView->SetBaseView(this);
_ImageViewer->SetFusionInputData(overlay_data); mImageViewer->SetFusionInputData(overlay_data);
_ImageViewer->SetFusionColorLeveL(level); mImageViewer->SetFusionColorLeveL(level);
_ImageViewer->SetFusionColorWindow(window); mImageViewer->SetFusionColorWindow(window);
_ImageViewer->SetFusionOpacity(_ImageViewer->GetFusionOpacity()); mImageViewer->SetFusionOpacity(mImageViewer->GetFusionOpacity());
// Example for vtkDiscretizableColorTransferFunction // Example for vtkDiscretizableColorTransferFunction
vtkNew< vtkDiscretizableColorTransferFunction> table; vtkNew< vtkDiscretizableColorTransferFunction> table;
@@ -299,14 +255,14 @@ void DicomImageView::SetFusionInput(DicomImageView *overlay)
table->AddRGBPoint(0.33, 1.0, 0.0, 0.0); table->AddRGBPoint(0.33, 1.0, 0.0, 0.0);
table->AddRGBPoint(0.66, 1.0, 1.0, 0.0); table->AddRGBPoint(0.66, 1.0, 1.0, 0.0);
table->AddRGBPoint(1.0, 1.0, 1.0, 1.0); table->AddRGBPoint(1.0, 1.0, 1.0, 1.0);
_ImageViewer->SetFusionColorTable(table); mImageViewer->SetFusionColorTable(table);
} }
void DicomImageView::SetFusionOpacity(double percent) { void DicomImageView::SetFusionOpacity(double percent) {
if (IsFusion()) { if (IsFusion()) {
_ImageViewer->IncreFusionOpacity(percent); mImageViewer->IncreFusionOpacity(percent);
_ImageViewer->Render(); mImageViewer->Render();
} }
} }
@@ -318,21 +274,21 @@ void DicomImageView::removeViewWithFusion()
if (HasSeries()) if (HasSeries())
{ {
if (IsFusion()) { if (IsFusion()) {
disconnect(_overlay, &DicomImageView::Signal_WindowLevelEventForFusion, disconnect(mOverlayView, &DicomImageView::Signal_WindowLevelEventForFusion,
this, &DicomImageView::Slot_WindowLevelEventForFusion); this, &DicomImageView::Slot_WindowLevelEventForFusion);
this->removeFusion(); this->removeFusion();
_overlay->SetBaseView(nullptr); mOverlayView->SetBaseView(nullptr);
_overlay = nullptr; mOverlayView = nullptr;
} }
if (IsOverlay()) { if (IsOverlay()) {
disconnect(this, &DicomImageView::Signal_WindowLevelEventForFusion, disconnect(this, &DicomImageView::Signal_WindowLevelEventForFusion,
_base, &DicomImageView::Slot_WindowLevelEventForFusion); mBaseView, &DicomImageView::Slot_WindowLevelEventForFusion);
_base->removeFusion(); mBaseView->removeFusion();
_base->SetOverlayView(nullptr); mBaseView->SetOverlayView(nullptr);
_base = nullptr; mBaseView = nullptr;
} }
} }
@@ -340,50 +296,50 @@ void DicomImageView::removeViewWithFusion()
void DicomImageView::removeFusion() void DicomImageView::removeFusion()
{ {
_ImageViewer->RemoveFusionData(); mImageViewer->RemoveFusionData();
_ImageViewer->FusionOff(); mImageViewer->FusionOff();
_ImageViewer->Render(); mImageViewer->Render();
_overlay->OverlayOff(); mOverlayView->OverlayOff();
} }
void DicomImageView::setDicomImageView(SeriesImageSet *series) void DicomImageView::setDicomImageView(SeriesImageSet *series)
{ {
if (!_ImageViewer){ if (!mImageViewer){
_ImageViewer = infinitiViewer::New(); mImageViewer = infinitiViewer::New();
_ImageViewer->SetRenderWindow(m_glrenWin); mImageViewer->SetRenderWindow(mGLRenWin);
_ImageViewer->SetupInteractor(m_glrenWin->GetInteractor()); mImageViewer->SetupInteractor(mGLRenWin->GetInteractor());
} }
//series->setVTKOpenGLNativeWidget(this->_glView); //series->setVTKOpenGLNativeWidget(this->_glView);
LoadSeries(series); LoadSeries(series);
//whenver change instance,set scroll value to zero //whenver change instance,set scroll value to zero
initScrollbar(); initScrollbar();
if (!slotInited){ if (!mIsSlotInited){
connect(_scrollBar, &QScrollBar::valueChanged, this, &DicomImageView::Slot_scrollValueChanged); connect(mScrollBar, &QScrollBar::valueChanged, this, &DicomImageView::Slot_scrollValueChanged);
connect(this, &DicomImageView::Signal_Transformation, this, &DicomImageView::Slot_Transformation); connect(this, &DicomImageView::Signal_Transformation, this, &DicomImageView::Slot_Transformation);
slotInited = true; mIsSlotInited = true;
} }
} }
bool DicomImageView::HasSeries() bool DicomImageView::HasSeries()
{ {
return _Series ; return mSeries ;
} }
void DicomImageView::LoadSeries(SeriesImageSet *series) void DicomImageView::LoadSeries(SeriesImageSet *series)
{ {
_Series = series; mSeries = series;
_ImageViewer->SetInputData(_Series->GetData()); mImageViewer->SetInputData(mSeries->GetData());
_ImageViewer->initCornerInfo(series->GetProperty()); mImageViewer->initCornerInfo(series->GetProperty());
_ImageViewer->setUpImageViewer(); mImageViewer->setUpImageViewer();
_ImageViewer->updateOrienInfo(); mImageViewer->updateOrienInfo();
//以下是一些转接函数 //以下是一些转接函数
//使用connect 替代 AddObserver,避免出现多种事件机制架构 //使用connect 替代 AddObserver,避免出现多种事件机制架构
connect(_ImageViewer->GetSignalRaiser(),&vtkSignalRaiser::raiseEvent, this, &DicomImageView::syncEventFunc); connect(mImageViewer->GetSignalRaiser(),&vtkSignalRaiser::raiseEvent, this, &DicomImageView::syncEventFunc);
//目前 替换了一部分包括SlicedEventEndDollyEventEndWindowLevelEventEndPanEvent主要关联到sync //目前 替换了一部分包括SlicedEventEndDollyEventEndWindowLevelEventEndPanEvent主要关联到sync
ActorDraggableInteractorStyle *style = _ImageViewer->GetInteractorStyle(); ActorDraggableInteractorStyle *style = mImageViewer->GetInteractorStyle();
style->AddObserver(ActorDraggableInteractorStyle::AfterViewerClicked, this, &DicomImageView::viewerClicked); style->AddObserver(ActorDraggableInteractorStyle::AfterViewerClicked, this, &DicomImageView::viewerClicked);
style->AddObserver(vtkCommand::EventIds::WindowLevelEvent, this, &DicomImageView::updateWindowLevelCb); style->AddObserver(vtkCommand::EventIds::WindowLevelEvent, this, &DicomImageView::updateWindowLevelCb);
style->AddObserver(ActorDraggableInteractorStyle::DoubleClickEvent, this, &DicomImageView::doubleclickedEventCb); style->AddObserver(ActorDraggableInteractorStyle::DoubleClickEvent, this, &DicomImageView::doubleclickedEventCb);
@@ -394,8 +350,8 @@ void DicomImageView::LoadSeries(SeriesImageSet *series)
//Callbacks------------------------------------------------------------------------------------ //Callbacks------------------------------------------------------------------------------------
void DicomImageView::updateWindowLevelCb(vtkObject* caller, unsigned long eid, void *calldata) void DicomImageView::updateWindowLevelCb(vtkObject* caller, unsigned long eid, void *calldata)
{ {
_ImageViewer->updateCornerInfo(BOTTOM_RIGHT); mImageViewer->updateCornerInfo(BOTTOM_RIGHT);
emit Signal_WindowLevelEventForFusion(_ImageViewer->GetColorLevel(), _ImageViewer->GetColorWindow()); emit Signal_WindowLevelEventForFusion(mImageViewer->GetColorLevel(), mImageViewer->GetColorWindow());
} }
void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, void* calldata) void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, void* calldata)
@@ -405,7 +361,7 @@ void DicomImageView::scalarEventCb(vtkObject* sender, unsigned long eventId, voi
{ {
case(ActorDraggableInteractorStyle::ScalarShiftEvent): case(ActorDraggableInteractorStyle::ScalarShiftEvent):
qDebug() << "ScalarShiftEvent"; qDebug() << "ScalarShiftEvent";
_ImageViewer->SwitchToNextPreset(); mImageViewer->SwitchToNextPreset();
break; break;
case(ActorDraggableInteractorStyle::ScalarOpacityEvent): case(ActorDraggableInteractorStyle::ScalarOpacityEvent):
@@ -439,9 +395,14 @@ void DicomImageView::syncEventFunc(vtkObject* caller, unsigned long eid, void *c
case(ActorDraggableInteractorStyle::DraggableStyleEvents::EndDollyEvent): case(ActorDraggableInteractorStyle::DraggableStyleEvents::EndDollyEvent):
this->Signal_SyncEvent(this, VTKIS_IMAGE_ZOOM, calldata); this->Signal_SyncEvent(this, VTKIS_IMAGE_ZOOM, calldata);
break; break;
case(ActorDraggableInteractorStyle::DraggableStyleEvents::SlicedEvent): case(ActorDraggableInteractorStyle::DraggableStyleEvents::SlicedEvent):{
_scrollBar->setValue(r[0]); mScrollBar->SetValueSilently(r[0]);
break; //invoke event
double focusPoint[3] = {.0, .0, .0};
mImageViewer->GetSlicePoint(focusPoint);
this->Signal_SyncEvent(this, VTKIS_IMAGE_SLICING, focusPoint);
break;
}
default: default:
break; break;
} }
@@ -453,21 +414,17 @@ void DicomImageView::ResetView()
{ {
removeViewWithFusion(); removeViewWithFusion();
removeViewWithMeasure(); removeViewWithMeasure();
_ImageViewer->GetRenderer()->RemoveAllViewProps(); mImageViewer->GetRenderer()->RemoveAllViewProps();
this->Render(); this->Render();
_ImageViewer->Delete(); mImageViewer->Delete();
_ImageViewer = nullptr; mImageViewer = nullptr;
//don't delete series It's belong to data cache //don't delete series It's belong to data cache
_Series = nullptr; mSeries = nullptr;
_ScrollTriggerType = scrollScope::TriggerType::USER_TRIGGER;
_PrevSlice = 0;
_SliceStep = 0;
} }
_scrollBar->setVisible(false); mScrollBar->setVisible(false);
if (isCine) if (mIsCine)
_vcr_toolbar->setVisible(false); mVcrToolbar->setVisible(false);
} }
@@ -475,7 +432,7 @@ int DicomImageView::getSeriesNumber()
{ {
if (HasSeries()) if (HasSeries())
{ {
return _Series->GetSeriesNumber(); return mSeries->GetSeriesNumber();
} }
return -1; return -1;
} }
@@ -483,7 +440,7 @@ int DicomImageView::getSeriesNumber()
void DicomImageView::ShowMetaData() void DicomImageView::ShowMetaData()
{ {
QString fileName = QString::fromLatin1(this->_Series->getCurImageName()); QString fileName = QString::fromLatin1(this->mSeries->getCurImageName());
if (!fileName.isEmpty()) { if (!fileName.isEmpty()) {
DcmFileFormat dcmFile; DcmFileFormat dcmFile;
if (!dcmFile.loadFile(fileName.toStdString()).good()) if (!dcmFile.loadFile(fileName.toStdString()).good())
@@ -510,40 +467,36 @@ void DicomImageView::Render()
{ {
if (HasSeries()) if (HasSeries())
{ {
if (_ImageViewer->GetvtkCornerAnnotation()) { if (mImageViewer->GetvtkCornerAnnotation()) {
_ImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size())); mImageViewer->GetvtkCornerAnnotation()->SetMaximumFontSize(FontSizeHelper::getSize(frameGeometry().size()));
} }
_ImageViewer->Render(); mImageViewer->Render();
} }
} }
void DicomImageView::SetSlice(int slice) void DicomImageView::SetSlice(int slice)
{ {
if (_ImageViewer == nullptr) if (mImageViewer == nullptr)
{ {
return; return;
} }
if (HasSeries()) if (HasSeries())
{ {
mImageViewer->SetSlice(slice);
_ImageViewer->SetSlice(slice);
//_ImageViewer->updateCornerInfo(TOP_LEFT);
_scrollBar->setValue(slice);
} }
} }
void DicomImageView::AddSlice(int step) void DicomImageView::AddSlice(int step)
{ {
if (_ImageViewer == nullptr) if (mImageViewer == nullptr)
{ {
return; return;
} }
if (HasSeries()) if (HasSeries())
{ {
int curSlice = _ImageViewer->GetSlice() + step; int curSlice = mImageViewer->GetSlice() + step;
_ImageViewer->SetSlice(curSlice); mImageViewer->SetSlice(curSlice);
_scrollBar->setValue(curSlice);
} }
} }
@@ -551,8 +504,8 @@ void DicomImageView::SetZoomScale(double scale)
{ {
if (HasSeries()) if (HasSeries())
{ {
_ImageViewer->SetZoomScale(scale); mImageViewer->SetZoomScale(scale);
_ImageViewer->Render(); mImageViewer->Render();
} }
} }
@@ -561,8 +514,8 @@ void DicomImageView::SetPanOffset(double * pan)
if (HasSeries()) if (HasSeries())
{ {
_ImageViewer->SetPanOffset(pan); mImageViewer->SetPanOffset(pan);
_ImageViewer->Render(); mImageViewer->Render();
} }
} }
@@ -571,7 +524,7 @@ void DicomImageView::ResetPanZoom()
{ {
if (HasSeries()) if (HasSeries())
{ {
_ImageViewer->ResetZoomScaleToFitWindowSize(); mImageViewer->ResetZoomScaleToFitWindowSize();
} }
} }
@@ -581,11 +534,11 @@ void DicomImageView::SetWindowLevel(double level, double width)
if (HasSeries()) if (HasSeries())
{ {
_ImageViewer->SetColorLevel(level); mImageViewer->SetColorLevel(level);
_ImageViewer->SetColorWindow(width); mImageViewer->SetColorWindow(width);
//You have to call updateConerInfo manually //You have to call updateConerInfo manually
//only mouse event can rely on callback //only mouse event can rely on callback
_ImageViewer->updateCornerInfo(BOTTOM_RIGHT); mImageViewer->updateCornerInfo(BOTTOM_RIGHT);
emit Signal_WindowLevelEventForFusion(level, width); emit Signal_WindowLevelEventForFusion(level, width);
} }
@@ -594,8 +547,8 @@ void DicomImageView::SetWindowLevel(double level, double width)
void DicomImageView::GetWindowLevel(double &level, double &width) { void DicomImageView::GetWindowLevel(double &level, double &width) {
if (HasSeries()) if (HasSeries())
{ {
level = _ImageViewer->GetColorLevel(); level = mImageViewer->GetColorLevel();
width = _ImageViewer->GetColorWindow(); width = mImageViewer->GetColorWindow();
} }
} }
@@ -603,15 +556,15 @@ void DicomImageView::ToggleNegativeMode()
{ {
if (HasSeries()) if (HasSeries())
{ {
if (isNegative) if (mIsNegative)
{ {
_ImageViewer->SetNegativeMode(false); mImageViewer->SetNegativeMode(false);
isNegative = false; mIsNegative = false;
} }
else else
{ {
_ImageViewer->SetNegativeMode(true); mImageViewer->SetNegativeMode(true);
isNegative = true; mIsNegative = true;
} }
} }
@@ -620,17 +573,17 @@ void DicomImageView::ToggleNegativeMode()
void DicomImageView::HFlip() void DicomImageView::HFlip()
{ {
if (HasSeries()) { if (HasSeries()) {
int slice = _ImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
//HFlip //HFlip
//_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0, 1, 0); //mImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0, 1, 0);
_ImageViewer->GetRenderer()->GetActiveCamera()->Azimuth(180); mImageViewer->GetRenderer()->GetActiveCamera()->Azimuth(180);
FlipExportHelper::toggleFlip(); FlipExportHelper::toggleFlip();
//to avoid black out problem during slicing //to avoid black out problem during slicing
//slicing is related with rotation, you have to recalculate to get it right //slicing is related with rotation, you have to recalculate to get it right
_ImageViewer->GetRenderer()->ResetCameraClippingRange(); mImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice); mImageViewer->SetSlice(slice);
_ImageViewer->GetRenderWindow()->Render(); mImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(H_FLIP); emit Signal_Transformation(H_FLIP);
} }
} }
@@ -638,20 +591,20 @@ void DicomImageView::HFlip()
void DicomImageView::VFlip() void DicomImageView::VFlip()
{ {
if (HasSeries()) { if (HasSeries()) {
//double scale = _ImageViewer->GetRenderer()->GetActiveCamera()->GetParallelScale(); //double scale = mImageViewer->GetRenderer()->GetActiveCamera()->GetParallelScale();
int slice = _ImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
//Method 2: Order matters //Method 2: Order matters
_ImageViewer->GetRenderer()->GetActiveCamera()->Elevation(-180); mImageViewer->GetRenderer()->GetActiveCamera()->Elevation(-180);
_ImageViewer->GetRenderer()->GetActiveCamera()->Roll(180); mImageViewer->GetRenderer()->GetActiveCamera()->Roll(180);
//_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0,-1,0); //mImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(0,-1,0);
FlipExportHelper::toggleFlip(); FlipExportHelper::toggleFlip();
//to avoid black out problem during slicing //to avoid black out problem during slicing
//slicing is related with rotation, you have to recalculate to get it right //slicing is related with rotation, you have to recalculate to get it right
_ImageViewer->GetRenderer()->ResetCameraClippingRange(); mImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice); mImageViewer->SetSlice(slice);
_ImageViewer->GetRenderWindow()->Render(); mImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(V_FLIP); emit Signal_Transformation(V_FLIP);
} }
@@ -660,13 +613,13 @@ void DicomImageView::VFlip()
void DicomImageView::Rotate(double angle, TransFormType operation) void DicomImageView::Rotate(double angle, TransFormType operation)
{ {
if (HasSeries()) { if (HasSeries()) {
int slice = _ImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
_ImageViewer->GetRenderer()->GetActiveCamera()->Roll(angle); mImageViewer->GetRenderer()->GetActiveCamera()->Roll(angle);
//to avoid black out problem during slicing //to avoid black out problem during slicing
//slcing is related with rotation, you have to recalculate to get it right //slcing is related with rotation, you have to recalculate to get it right
_ImageViewer->GetRenderer()->ResetCameraClippingRange(); mImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice); mImageViewer->SetSlice(slice);
// _ImageViewer->GetRenderWindow()->Render(); // mImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(operation); emit Signal_Transformation(operation);
} }
@@ -676,21 +629,21 @@ void DicomImageView::ClearTransformations()
{ {
if (HasSeries()) if (HasSeries())
{ {
int slice = _ImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
ResetPanZoom(); ResetPanZoom();
double cameraPosition[3]; double cameraPosition[3];
double vup[3]; double vup[3];
_Series->getCameraCfg(vup, cameraPosition); mSeries->getCameraCfg(vup, cameraPosition);
//necessary to reset flip and rotate //necessary to reset flip and rotate
_ImageViewer->GetRenderer()->GetActiveCamera()->SetPosition(cameraPosition); mImageViewer->GetRenderer()->GetActiveCamera()->SetPosition(cameraPosition);
_ImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(vup); mImageViewer->GetRenderer()->GetActiveCamera()->SetViewUp(vup);
//avoid black out problem //avoid black out problem
_ImageViewer->GetRenderer()->ResetCameraClippingRange(); mImageViewer->GetRenderer()->ResetCameraClippingRange();
_ImageViewer->SetSlice(slice); mImageViewer->SetSlice(slice);
//Render //Render
_ImageViewer->GetRenderWindow()->Render(); mImageViewer->GetRenderWindow()->Render();
emit Signal_Transformation(CLEAR); emit Signal_Transformation(CLEAR);
} }
} }
@@ -699,7 +652,7 @@ void DicomImageView::updateCornerInfoAll()
{ {
if (HasSeries()) if (HasSeries())
{ {
_ImageViewer->updateCornerInfoAll(); mImageViewer->updateCornerInfoAll();
} }
} }
@@ -707,141 +660,141 @@ void DicomImageView::updateCornerInfoPrivacy()
{ {
if (HasSeries()) if (HasSeries())
{ {
_ImageViewer->updateCornerInfo(TOP_RIGHT); mImageViewer->updateCornerInfo(TOP_RIGHT);
} }
} }
//--VCR about------------------------------------------------------------------ //--VCR about------------------------------------------------------------------
bool DicomImageView::isVCRVisible() bool DicomImageView::isVCRVisible()
{ {
if (!_vcr_toolbar) return false; if (!mVcrToolbar) return false;
return _vcr_toolbar->isVisible(); return mVcrToolbar->isVisible();
} }
void DicomImageView::setVCRVisible(bool visible) void DicomImageView::setVCRVisible(bool visible)
{ {
if (!_vcr_toolbar) return ; if (!mVcrToolbar) return ;
_vcr_toolbar->setVisible(visible); mVcrToolbar->setVisible(visible);
} }
void DicomImageView::cineModeOn() void DicomImageView::cineModeOn()
{ {
if (!_vcr_toolbar) return; if (!mVcrToolbar) return;
//updateVCRToolbarPos(); //updateVCRToolbarPos();
int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 + VCRHelper::getVCRXOffset(); int ax = (this->geometry().bottomLeft().x() + this->geometry().bottomRight().x()) / 2 + VCRHelper::getVCRXOffset();
int ay = (this->geometry().bottomLeft().y() + this->geometry().bottomRight().y()) / 2 + VCRHelper::getVCRYOffset(); int ay = (this->geometry().bottomLeft().y() + this->geometry().bottomRight().y()) / 2 + VCRHelper::getVCRYOffset();
_vcr_toolbar->move(ax, ay); mVcrToolbar->move(ax, ay);
_vcr_toolbar->show(); mVcrToolbar->show();
this->initCineModeThread(); this->initCineModeThread();
_vcr_toolbar->reConnectController(_vcr_ctrl); mVcrToolbar->reConnectController(mVcrController);
} }
void DicomImageView::initCineModeThread() void DicomImageView::initCineModeThread()
{ {
_vcr_ctrl = new pqVCRController(nullptr, this); mVcrController = new pqVCRController(nullptr, this);
_vcr_ctrl->moveToThread(&_thread); mVcrController->moveToThread(&mVcrControlThread);
connect(&_thread, &QThread::finished, _vcr_ctrl, &QObject::deleteLater); connect(&mVcrControlThread, &QThread::finished, mVcrController, &QObject::deleteLater);
_thread.start(); mVcrControlThread.start();
isCine = true; mIsCine = true;
} }
void DicomImageView::onFirstFrame() void DicomImageView::onFirstFrame()
{ {
if (HasSeries()) { if (HasSeries()) {
_scrollBar->setValue(_ImageViewer->GetSliceMin()); mScrollBar->setValue(mImageViewer->GetSliceMin());
} }
} }
void DicomImageView::onPreviousFrame() void DicomImageView::onPreviousFrame()
{ {
if (HasSeries()) { if (HasSeries()) {
int slice = _ImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
slice = --slice; slice = --slice;
int min_slice = _ImageViewer->GetSliceMin(); int min_slice = mImageViewer->GetSliceMin();
if (slice < min_slice) if (slice < min_slice)
{ {
slice = _ImageViewer->GetSliceMax(); slice = mImageViewer->GetSliceMax();
} }
_scrollBar->setValue(slice); mScrollBar->setValue(slice);
} }
} }
void DicomImageView::onNextFrame() void DicomImageView::onNextFrame()
{ {
if (HasSeries()) { if (HasSeries()) {
int slice = _ImageViewer->GetSlice(); int slice = mImageViewer->GetSlice();
slice = ++slice; slice = ++slice;
int max_slice = _ImageViewer->GetSliceMax(); int max_slice = mImageViewer->GetSliceMax();
if (slice > max_slice) if (slice > max_slice)
{ {
slice = _ImageViewer->GetSliceMin(); slice = mImageViewer->GetSliceMin();
} }
_scrollBar->setValue(slice); mScrollBar->setValue(slice);
} }
} }
void DicomImageView::onLastFrame() void DicomImageView::onLastFrame()
{ {
if (HasSeries()) { if (HasSeries()) {
_scrollBar->setValue(_ImageViewer->GetSliceMax()); mScrollBar->setValue(mImageViewer->GetSliceMax());
} }
} }
//-- Measure about-------------------------------------------------------------------------------------- //-- Measure about--------------------------------------------------------------------------------------
void DicomImageView::ActiveMeasure(Measure *m) void DicomImageView::ActiveMeasure(Measure *m)
{ {
if (nullptr != _Series) if (nullptr != mSeries)
{ {
_ImageViewer->ActiveMeasure(m); mImageViewer->ActiveMeasure(m);
} }
} }
void DicomImageView::DeleteSelectedMeasure() void DicomImageView::DeleteSelectedMeasure()
{ {
if (nullptr != _Series) if (nullptr != mSeries)
{ {
_ImageViewer->DeleteSelectedMeasure(); mImageViewer->DeleteSelectedMeasure();
} }
} }
void DicomImageView::DeleteCurrentSliceMeasure() void DicomImageView::DeleteCurrentSliceMeasure()
{ {
if (nullptr != _Series) if (nullptr != mSeries)
{ {
_ImageViewer->DeleteCurrentSliceMeasure(); mImageViewer->DeleteCurrentSliceMeasure();
} }
} }
void DicomImageView::DeleteCurrentSeriesMeasure() void DicomImageView::DeleteCurrentSeriesMeasure()
{ {
if (nullptr != _Series) if (nullptr != mSeries)
{ {
_ImageViewer->DeleteCurrentSeriesMeasure(); mImageViewer->DeleteCurrentSeriesMeasure();
} }
} }
void DicomImageView::removeViewWithMeasure() void DicomImageView::removeViewWithMeasure()
{ {
_ImageViewer->UnActiveMeasure(); mImageViewer->UnActiveMeasure();
_ImageViewer->DeleteCurrentSeriesMeasure(); mImageViewer->DeleteCurrentSeriesMeasure();
} }
void DicomImageView::SetSliceOrientation(int orientation) { void DicomImageView::SetSliceOrientation(int orientation) {
slice_orientation = orientation; mSliceOrientation = orientation;
_ImageViewer->SetSliceOrientation(orientation); mImageViewer->SetSliceOrientation(orientation);
int max = 0; int max = 0;
int min = 0; int min = 0;
_ImageViewer->GetSliceRange(min, max); mImageViewer->GetSliceRange(min, max);
_scrollBar->setValue(min); mScrollBar->setValue(min);
_scrollBar->setMaximum(max); mScrollBar->setMaximum(max);
_scrollBar->setValue(0); mScrollBar->setValue(0);
} }
int DicomImageView::GetSliceOrientation() { int DicomImageView::GetSliceOrientation() {
return slice_orientation; return mSliceOrientation;
} }
void DicomImageView::viewerClicked() { void DicomImageView::viewerClicked() {
@@ -849,8 +802,8 @@ void DicomImageView::viewerClicked() {
} }
void DicomImageView::SyncScrollBar() { void DicomImageView::SyncScrollBar() {
setScrollChangedType(scrollScope::TriggerType::SYNC_ONLY); // setScrollChangedType(scrollScope::TriggerType::SYNC_ONLY);
_scrollBar->setValue(_ImageViewer->GetSlice()); mScrollBar->SetValueSilently(mImageViewer->GetSlice());
_ImageViewer->updateCornerInfo(TOP_LEFT); mImageViewer->updateCornerInfo(TOP_LEFT);
setScrollChangedType(scrollScope::TriggerType::USER_TRIGGER); // setScrollChangedType(scrollScope::TriggerType::USER_TRIGGER);
} }

View File

@@ -1,163 +1,192 @@
#pragma once #ifndef OMEGAV_DICOM_IMAGE_VIEW_H
#define OMEGAV_DICOM_IMAGE_VIEW_H
#include <QFrame> #include <QFrame>
#include <QOpenGLWidget> #include <QOpenGLWidget>
#include "UI/Widget/ClickableScrollBar.h"
#include <QGridLayout> #include <QGridLayout>
#include "Common/SeriesImageSet.h"
#include <QThread> #include <QThread>
#include "Common/SeriesImageSet.h"
#include "UI/Widget/ClickableScrollBar.h"
#include "Rendering/infinitiViewer.h" #include "Rendering/infinitiViewer.h"
class vtkCornerAnnotation; class vtkCornerAnnotation;
class vtkGenericOpenGLRenderWindow; class vtkGenericOpenGLRenderWindow;
class MyTitleBar; class MyTitleBar;
class pqVCRController; class pqVCRController;
class pqVCRToolbar; class pqVCRToolbar;
class QVTKOpenGLNativeWidget; class QVTKOpenGLNativeWidget;
class Measure; class Measure;
namespace scrollScope { class DicomImageView : public QFrame {
enum TriggerType Q_OBJECT
{
USER_TRIGGER, //a,b,c
STYLE_TRIGGER,//b,c
SYNC_ONLY,//do nothing
};
}
class DicomImageView : public QFrame
{
Q_OBJECT
public: public:
//a:real effect
//b:corner info update
//c:scroll value sync
explicit DicomImageView(QWidget* parent = Q_NULLPTR);
~DicomImageView() override;
void ShowMetaData(); explicit DicomImageView(QWidget *parent = Q_NULLPTR);
QVTKOpenGLNativeWidget* getGLWidget()
{
return _glWidt;
}
infinitiViewer* getImageViewer()
{
return _ImageViewer;
}
void setScrollChangedType(int type) ~DicomImageView() override;
{
_ScrollTriggerType = type;
}
void setHighlight(bool yes);
void Render();
//Series void ShowMetaData();
void setDicomImageView(SeriesImageSet *series);
bool HasSeries();
int getSeriesNumber();
SeriesImageSet* getSeriesInstance()
{
return _Series;
}
//Reset QVTKOpenGLNativeWidget *getGLWidget() {
void ResetView(); return mGLWidget;
}
infinitiViewer *getImageViewer() {
return mImageViewer;
}
void setHighlight(bool yes);
void Render();
//Series
void setDicomImageView(SeriesImageSet *series);
bool HasSeries();
int getSeriesNumber();
SeriesImageSet *getSeriesInstance() {
return mSeries;
}
//Reset
void ResetView();
//Corner Info //Corner Info
void updateCornerInfoAll(); void updateCornerInfoAll();
void updateCornerInfoPrivacy();
//Window level void updateCornerInfoPrivacy();
void GetWindowLevel(double &level, double &width);
void SetWindowLevel(double level, double width);
//Transformation //Window level
void ClearTransformations(); void GetWindowLevel(double &level, double &width);
void HFlip();
void VFlip(); void SetWindowLevel(double level, double width);
void Rotate(double angle, TransFormType operation);
//Transformation
void ClearTransformations();
void HFlip();
void VFlip();
void Rotate(double angle, TransFormType operation);
//Fusion //Fusion
bool IsFusion(); bool IsFusion();
void SetFusionOpacity(double percent);
void SetFusionInput(DicomImageView *overlap); void SetFusionOpacity(double percent);
void removeViewWithFusion();
void SetFusionInput(DicomImageView *overlap);
void removeViewWithFusion();
//Measure //Measure
void ActiveMeasure(Measure *m); void ActiveMeasure(Measure *m);
void DeleteSelectedMeasure();
void DeleteCurrentSliceMeasure(); void DeleteSelectedMeasure();
void DeleteCurrentSeriesMeasure();
void removeViewWithMeasure(); void DeleteCurrentSliceMeasure();
void DeleteCurrentSeriesMeasure();
void removeViewWithMeasure();
//Sync slice //Sync slice
void AddSlice(int step); void AddSlice(int step);
void SetSlice(int slice);
void SetZoomScale(double scale);
void SetPanOffset(double * p);
void SyncScrollBar();
//CineMode void SetSlice(int slice);
void onFirstFrame();
void onPreviousFrame();
void onNextFrame();
void onLastFrame();
bool IsCine() { return isCine; }
void cineModeOn();
bool isVCRVisible();
void setVCRVisible(bool);
void setVCRToolbar(pqVCRToolbar* toolbar)
{
_vcr_toolbar = toolbar;
}
pqVCRToolbar* getVCRToolbar()
{
return _vcr_toolbar;
}
pqVCRController* getVCRController()
{
return _vcr_ctrl;
}
//Negative void SetZoomScale(double scale);
void ToggleNegativeMode();
void SetPanOffset(double *p);
void SyncScrollBar();
//CineMode
void onFirstFrame();
void onPreviousFrame();
void onNextFrame();
void onLastFrame();
bool IsCine() { return mIsCine; }
void cineModeOn();
bool isVCRVisible();
void setVCRVisible(bool);
void setVCRToolbar(pqVCRToolbar *toolbar) {
mVcrToolbar = toolbar;
}
pqVCRToolbar *getVCRToolbar() {
return mVcrToolbar;
}
pqVCRController *getVCRController() {
return mVcrController;
}
//Negative
void ToggleNegativeMode();
void SetSliceOrientation(int orientation);
void SetSliceOrientation(int orientation);
int GetSliceOrientation(); int GetSliceOrientation();
bool CompareWorldSliceOrientation(DicomImageView* view){ bool CompareWorldSliceOrientation(DicomImageView *view) {
return this->_ImageViewer->GetWorldSliceOrientation() == view->_ImageViewer->GetWorldSliceOrientation(); return this->mImageViewer->GetWorldSliceOrientation() == view->mImageViewer->GetWorldSliceOrientation();
} }
void SyncSlicePoint(double* point){
_ImageViewer->SyncSlicePoint(point); void SyncSlicePoint(double *point) {
_ImageViewer->Render(); mImageViewer->SyncSlicePoint(point);
mImageViewer->Render();
} }
signals: signals:
/** void Signal_ViewEmpty(DicomImageView *view);
* This signal will be emitted whenever a mouse event occurs within the QVTK window.
*/ void Signal_ViewClicked(DicomImageView *view);
void scroll_ValueChanged(int); void Signal_viewDoubleclicked(DicomImageView *view);
void Signal_ViewEmpty(DicomImageView *view);
void Signal_ViewClicked(DicomImageView *view); void Signal_DragDropEvent(DicomImageView *view, thumbnailImage *tb);
void Signal_viewDoubleclicked(DicomImageView *view);
void Signal_scrollValueChanged(DicomImageView *view, int slice); void Signal_SyncEvent(DicomImageView *view, int interactionMode, void *calldata);
void Signal_DragDropEvent(DicomImageView *view,thumbnailImage* tb);
void Signal_SyncEvent(DicomImageView *view, int interactionMode,void* calldata); void Signal_WindowLevelEventForFusion(double level, double width);
void Signal_WindowLevelEventForFusion(double level,double width);
void Signal_Transformation(TransFormType); void Signal_Transformation(TransFormType);
public slots: public slots:
//for title bar use
void Slot_viewDoubleclicked(); //for title bar use
void Slot_ViewEmpty(); void Slot_viewDoubleclicked();
void Slot_scrollValueChanged(int);
void Slot_WindowLevelEventForFusion(double level, double width); void Slot_ViewEmpty();
void Slot_Transformation();
void Slot_scrollValueChanged(int);
void Slot_WindowLevelEventForFusion(double level, double width);
void Slot_Transformation();
void viewerClicked(); void viewerClicked();
protected: protected:
@@ -166,82 +195,108 @@ protected:
* @attention 只能捕获到titlebar区域的点击 * @attention 只能捕获到titlebar区域的点击
* @param event * @param event
*/ */
void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE; void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
void dragEnterEvent(QDragEnterEvent *e); void wheelEvent(QWheelEvent *event) Q_DECL_OVERRIDE;
void dragMoveEvent(QDragMoveEvent *e);
void dropEvent(QDropEvent *e); /**
void dragLeaveEvent(QDragLeaveEvent *e); * @brief DicomImageView::dragEnterEvent
void resizeEvent(QResizeEvent *event); * 拖拽进入
* @param e
*/
void dragEnterEvent(QDragEnterEvent *e) Q_DECL_OVERRIDE;
/**
* @brief DicomImageView::dragMoveEvent
* 拖拽移动
* @param e
*/
void dragMoveEvent(QDragMoveEvent *e) Q_DECL_OVERRIDE;
/**
* @brief DicomImageView::dropEvent
* 拖拽松开
* @param e
*/
void dropEvent(QDropEvent *e) Q_DECL_OVERRIDE;
/**
* @brief DicomImageView::dragLeaveEvent
* 离开事件
* @param e
*/
void dragLeaveEvent(QDragLeaveEvent *e) Q_DECL_OVERRIDE;
void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE;
private: private:
void removeFusion(); void removeFusion();
void OverlayOn() void OverlayOn() {
{ mIsOverlay = true;
isOverlay = true; }
}
void OverlayOff() void OverlayOff() {
{ mIsOverlay = false;
isOverlay = false; }
}
bool IsOverlay() bool IsOverlay() {
{ return mIsOverlay;
return isOverlay; }
}
void SetBaseView(DicomImageView *v) void SetBaseView(DicomImageView *v) {
{ mBaseView = v;
_base = v; }
}
void SetOverlayView(DicomImageView *v) void SetOverlayView(DicomImageView *v) {
{ mOverlayView = v;
_overlay = v; }
}
//Callback
//Callback void doubleclickedEventCb(vtkObject *sender, unsigned long eventId, void *calldata = nullptr);
void doubleclickedEventCb(vtkObject* sender, unsigned long eventId, void* calldata = nullptr);
void scalarEventCb(vtkObject* sender, unsigned long eventId, void* calldata = nullptr); void scalarEventCb(vtkObject *sender, unsigned long eventId, void *calldata = nullptr);
void updateWindowLevelCb(vtkObject*caller, unsigned long eid, void *calldata);
void syncEventFunc(vtkObject*caller, unsigned long eid, void *calldata); void updateWindowLevelCb(vtkObject *caller, unsigned long eid, void *calldata);
void syncEventFunc(vtkObject *caller, unsigned long eid, void *calldata);
void initCineModeThread(); void initCineModeThread();
/** /**
* create a TitleBar for this widget * create a TitleBar for this widget
* @return * @return
*/ */
MyTitleBar* createMyTitleBar(); MyTitleBar *createMyTitleBar();
void ResetPanZoom(); void ResetPanZoom();
void initScrollbar(); void initScrollbar();
void LoadSeries(SeriesImageSet *series);
vtkSmartPointer <vtkGenericOpenGLRenderWindow> m_glrenWin;
infinitiViewer* _ImageViewer = nullptr; void LoadSeries(SeriesImageSet *series);
SeriesImageSet* _Series = nullptr;
ClickableScrollBar* _scrollBar =nullptr;
MyTitleBar *_titleBar =nullptr;
QVTKOpenGLNativeWidget* _glWidt = nullptr;
pqVCRToolbar* _vcr_toolbar = nullptr;
pqVCRController *_vcr_ctrl = nullptr;
QThread _thread;
DicomImageView *_overlay = nullptr;
DicomImageView *_base = nullptr;
int _SliceStep =0; vtkSmartPointer<vtkGenericOpenGLRenderWindow> mGLRenWin;
int _PrevSlice =0;
int _ScrollTriggerType = scrollScope::TriggerType::USER_TRIGGER;
int slice_orientation = 2;
bool isCine = false; infinitiViewer *mImageViewer = nullptr;
bool isNegative = false; SeriesImageSet *mSeries = nullptr;
bool isOverlay = false; ClickableScrollBar *mScrollBar = nullptr;
bool slotInited = false; MyTitleBar *mTitleBar = nullptr;
QVTKOpenGLNativeWidget *mGLWidget = nullptr;
pqVCRToolbar *mVcrToolbar = nullptr;
pqVCRController *mVcrController = nullptr;
QThread mVcrControlThread;
DicomImageView *mOverlayView = nullptr;
DicomImageView *mBaseView = nullptr;
int mSliceOrientation = 2;
bool mIsCine = false;
bool mIsNegative = false;
bool mIsOverlay = false;
bool mIsSlotInited = false;
}; };
#endif