Refactor QDicomViewer, extract toolbar DefaultToolBar class, refactor state -> button ready, need add state check.

This commit is contained in:
Krad
2022-08-02 17:01:43 +08:00
parent 2e0ee21631
commit e4cd58fe12
9 changed files with 190 additions and 324 deletions

View File

@@ -82,7 +82,8 @@ enum AnnotationActorType
ArrowAnn,
EllipseAnn,
TextAnn,
//HiddenAnn,
};
enum AnnotationDeleteType{
DeleteSelectedAnn,
DeleteSliceAnn,
DeleteSeriesAnn
@@ -188,11 +189,15 @@ public:
}
static void PrivacyOn()
{
if (privacyOn) return;
privacyOn = true;
EventsCenter::TriggerEvent(AnonymizeStateChanged);
}
static void PrivacyOff()
{
if (!privacyOn) return;
privacyOn = false;
EventsCenter::TriggerEvent(AnonymizeStateChanged);
}
static bool IsAnno()
@@ -202,6 +207,7 @@ public:
static void toggleAnno()
{
annotOn = !annotOn;
EventsCenter::TriggerEvent(AnnotationStateChanged);
}
private:
@@ -219,6 +225,12 @@ public:
}
static void setMeasureType(int type){
measureType = type;
EventsCenter::TriggerEvent(MeasureTypeChanged);
}
static void deleteMeasure(int deleteType){
EventObject type;
type.AddDetailValue("type",deleteType);
EventsCenter::TriggerEvent(MeasureDelete, &type);
}
private:
static int measureType;

View File

@@ -5,14 +5,20 @@
#ifndef OMEGAV_EVENTSCENTER_H
#define OMEGAV_EVENTSCENTER_H
#include <QtCore/QObject>
#include "QtCore/qmap.h"
#include "QString"
#include <QObject>
#include <QMap>
#include <QString>
#include <QVariant>
#define aLLEventMacro() \
_add_Event(DefaultEvent)\
_add_Event(DragEvent)\
_add_Event(SyncStateChanged)
_add_Event(SyncStateChanged)\
_add_Event(AnnotationStateChanged)\
_add_Event(AnonymizeStateChanged)\
_add_Event(MeasureHideChanged)\
_add_Event(MeasureTypeChanged)\
_add_Event(MeasureDelete)
enum Events{
@@ -24,8 +30,8 @@ class EventObject {
public:
void* Sender= nullptr;
bool Cancel = false;
QMap<QString,void*> Detail;
void AddDetailValue(const QString& key, void* val)
QMap<QString,QVariant> Detail;
void AddDetailValue(const QString& key, QVariant val)
{
Detail[key]=val;
}

View File

@@ -10,6 +10,7 @@ Measure* GetNextMeasure() override\
#include <QString>
#include "Events/EventsCenter.h"
class vtkRenderWindowInteractor;
@@ -49,7 +50,9 @@ public:
}
static void SetHidden(bool h) {
if (Measure::Hidden == h) return;
Measure::Hidden = h;
EventsCenter::TriggerEvent(MeasureHideChanged);
}
static bool GetHidden() {

View File

@@ -19,6 +19,20 @@
ImageViewManager::ImageViewManager(QObject *parent)
: QObject(parent), currentView(nullptr), currentFusionView(nullptr), mMaxed(false) {
connect(EventsCenter::Default(),&EventsCenter::AnnotationStateChanged,
this, &ImageViewManager::updateCornerInfoAll);
connect(EventsCenter::Default(),&EventsCenter::AnonymizeStateChanged,
this, &ImageViewManager::updateCornerInfoPrivacy);
connect(EventsCenter::Default(),&EventsCenter::MeasureHideChanged,
this, &ImageViewManager::renderAll);
connect(EventsCenter::Default(),&EventsCenter::MeasureTypeChanged,
this, &ImageViewManager::activeMeasure);
connect(EventsCenter::Default(),&EventsCenter::MeasureDelete,
this, &ImageViewManager::deleteMeasure);
}
// views manage----------------------------------------------------------------
@@ -299,6 +313,28 @@ void ImageViewManager::activeMeasure() {
}, nullptr, nullptr, ImageViewManager::All);
}
void ImageViewManager::deleteMeasure(EventObject* deleteType){
switch (deleteType->Detail["type"].toInt()) {
case AnnotationDeleteType::DeleteSelectedAnn:
if (currentView != nullptr) {
currentView->deleteSelectedMeasure();
}
break;
case AnnotationDeleteType::DeleteSliceAnn:
if (currentView != nullptr) {
currentView->deleteCurrentSliceMeasure();
}
break;
case AnnotationDeleteType::DeleteSeriesAnn:
if (currentView != nullptr) {
currentView->deleteCurrentSeriesMeasure();
}
break;
default:
break;
}
}
void ImageViewManager::switchSliceOrientation() {
currentView->setSliceOrientation((currentView->getSliceOrientation() + 1) % 3);
emit currentViewReload(currentView);

View File

@@ -84,6 +84,8 @@ public:
void activeMeasure();
void deleteMeasure(EventObject* deleteType);
void switchSliceOrientation();
void updateCornerInfoAll();

View File

@@ -125,9 +125,11 @@ void DefaultToolBar::initButtons() {
SetupExportTool();
SetupGridTool();
SetupSyncTool();
SetupAnnoTool();
SetupModeTool();
SetupTransformTool();
SetupFusionTool();
SetupMPR();
SetupCineTool();
SetupEmptyTool();
SetupScreenTool();
@@ -205,7 +207,7 @@ void DefaultToolBar::SetupSyncTool() {
void DefaultToolBar::syncStateChanged() const {
switch (SyncHelper::getSyncState()) {
case AUTO_SYNC:
// mBtnSync->setIcon(mAutoIcon);
mBtnSync->setIcon(mAutoIcon);
mActionSyncState->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[AUTO_SYNC]));
for (int i = 0; i < SYNC_ITEM_NUM; i++) {
mSyncActions[i]->setDisabled(false);
@@ -216,7 +218,7 @@ void DefaultToolBar::syncStateChanged() const {
break;
case MANUAL_SYNC:{
// mBtnSync->setIcon(mManualIcon);
mBtnSync->setIcon(mManualIcon);
mActionSyncState->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[MANUAL_SYNC]));
mSyncActions[SLICE_POS]->setChecked(SyncHelper::getSyncItem(SLICE_POS));
mSyncActions[WIDTH_LEVEL]->setChecked(SyncHelper::getSyncItem(WIDTH_LEVEL));
@@ -224,7 +226,7 @@ void DefaultToolBar::syncStateChanged() const {
break;
}
case DIS_SYNC:
// mBtnSync->setIcon(mDisIcon);
mBtnSync->setIcon(mDisIcon);
mActionSyncState->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[DIS_SYNC]));
for (int i = 0; i < SYNC_ITEM_NUM; i++) {
mSyncActions[i]->setChecked(false);
@@ -239,7 +241,7 @@ void DefaultToolBar::syncStateChanged() const {
void DefaultToolBar::SetupModeTool() {
mBtnWindow->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
mBtnWindow->setToolTip(QString("Adjust window level"));
connect(mBtnWindow, &QToolButton::clicked, this, [&] {
connect(mBtnWindow, &QToolButton::clicked, this, [=]() {
emit modeChanged(7);
});
@@ -255,17 +257,17 @@ void DefaultToolBar::SetupModeTool() {
mBtnWindow->setMenu(m);
mBtnPan->setToolTip(QString("Pan image"));
connect(mBtnPan, &QToolButton::clicked, this, [&] {
connect(mBtnPan, &QToolButton::clicked, this, [=]() {
emit modeChanged(5);
});
mBtnZoom->setToolTip(QString("Zoom image"));
connect(mBtnZoom, &QToolButton::clicked, this, [&] {
connect(mBtnZoom, &QToolButton::clicked, this, [=]() {
emit modeChanged(6);
});
mBtnSlice->setToolTip(QString("Browse series"));
connect(mBtnSlice, &QToolButton::clicked, this, [&] {
connect(mBtnSlice, &QToolButton::clicked, this, [=]() {
emit modeChanged(4);
});
@@ -274,27 +276,14 @@ void DefaultToolBar::SetupModeTool() {
void DefaultToolBar::SetupAnnoTool() {
mBtnAnonymize->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
//主要设置了四角标签的操作逻辑
mBtnAnonymize->setToolTip(QString("Toggle annotations"));
//视窗操作,显隐脚注
// connect(mBtnAnonymize, &QToolButton::clicked, this, [=] {
// AnnoHelper::toggleAnno();
// ui->viewContainer->getViewManager()->updateCornerInfoAll();
// });
mBtnAnonymize->setCheckable(true);
//视窗操作,显隐测量
QMenu *m;
m = new QMenu(this);
// connect(m, &QMenu::triggered, this, [=] {
// //load data
// mActionHideMeasure->setChecked(Measure::GetHidden());
// });
//视窗操作,显隐测量
mActionHideMeasure = m->addAction(tr("Hide all measurements"), this, [=](bool value) {
Measure::SetHidden(!mActionHideMeasure->isChecked());
// ui->viewContainer->getViewManager()->renderAll();
Measure::SetHidden(mActionHideMeasure->isChecked());
});
mActionHideMeasure->setCheckable(true);
mActionHideMeasure->setChecked(false);
@@ -308,13 +297,20 @@ void DefaultToolBar::SetupAnnoTool() {
} else {
AnnoHelper::PrivacyOff();
}
// ui->viewContainer->getViewManager()->updateCornerInfoPrivacy();
mBtnAnonymize->setChecked(mActionHidePatData->isChecked());
});
mActionHidePatData->setCheckable(true);
mActionHidePatData->setChecked(false);
m->addAction(tr("Show Dicom tags"), this, &DefaultToolBar::showMeta);
connect(mBtnAnonymize,&QToolButton::clicked,this,[=]{
if (mBtnAnonymize->isChecked()) {
AnnoHelper::PrivacyOn();
} else {
AnnoHelper::PrivacyOff();
}
mActionHidePatData->setChecked(mBtnAnonymize->isChecked());
});
mBtnAnonymize->setPopupMode(QToolButton::MenuButtonPopup);
mBtnAnonymize->setMenu(m);
}
@@ -325,18 +321,21 @@ void DefaultToolBar::SetupMeasureTool() {
mBtnMeasure->setChecked(true);\
QPixmap map(std::get<1>(MEASURE_ACTIIONS[index]));\
mBtnMeasure->setIcon(QIcon(map));\
MeasureHelper::setMeasureType(std::get<2>(MEASURE_ACTIIONS[index]));\
})
// MeasureHelper::setMeasureType(std::get<2>(MEASURE_ACTIIONS[index]));\
// ui->viewContainer->getViewManager()->activeMeasure();\
#define ADD_DEL_ACTION(text, type, func)\
m->addAction(tr(text));
#define ADD_DEL_ACTION(text, type)\
m->addAction(tr(text),this,[]{\
MeasureHelper::deleteMeasure(type);\
});
mBtnMeasure->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
mBtnMeasure->setToolTip(QString("Measurements"));
connect(mBtnMeasure, &QToolButton::clicked, this, &DefaultToolBar::activeMeasure);
connect(mBtnMeasure, &QToolButton::clicked, [=](){
MeasureHelper::setMeasureType(MeasureHelper::getMeasureType());
});
QMenu *m;
m = new QMenu(this);
@@ -345,9 +344,9 @@ void DefaultToolBar::SetupMeasureTool() {
ADD_MEASURE_ACTION(j);
}
m->addSeparator();
ADD_DEL_ACTION("Delete selected", AnnotationActorType::DeleteSelectedAnn, deleteSelectedMeasure);
ADD_DEL_ACTION("Delete all in current slice", AnnotationActorType::DeleteSliceAnn, deleteCurrentSliceMeasure);
ADD_DEL_ACTION("Delete all in current series", AnnotationActorType::DeleteSeriesAnn, deleteCurrentSeriesMeasure);
ADD_DEL_ACTION("Delete selected", AnnotationDeleteType::DeleteSelectedAnn);
ADD_DEL_ACTION("Delete all in current slice", AnnotationDeleteType::DeleteSliceAnn);
ADD_DEL_ACTION("Delete all in current series", AnnotationDeleteType::DeleteSeriesAnn);
mBtnMeasure->setPopupMode(QToolButton::MenuButtonPopup);
mBtnMeasure->setMenu(m);
}
@@ -364,7 +363,7 @@ void DefaultToolBar::SetupFusionTool() {
});
mBtnFusion->setPopupMode(QToolButton::MenuButtonPopup);
mBtnFusion->setMenu(m);
mBtnFusion->setEnabled(false);
// mBtnFusion->setEnabled(false);
}
void DefaultToolBar::SetupCineTool() {
@@ -403,6 +402,22 @@ void DefaultToolBar::SetupTransformTool() {
});
}
void DefaultToolBar::SetupMPR(){
connect(mBtnMPR, &QToolButton::clicked, [=](){
SyncHelper::setSyncState(DIS_SYNC);
syncStateChanged();
emit changeSliceOrientation();
});
// mBtnMPR->setEnabled(false);
}
void DefaultToolBar::resetNeedCheckFunctionButtons(){
// mBtnMPR->setEnabled(false);
mBtnFusion->setEnabled(false);
SyncHelper::setSyncState(DIS_SYNC);
syncStateChanged();
}
void DefaultToolBar::SetupScreenTool() {
mBtnFullScreen->setToolTip(QString("Full screen"));
connect(mBtnFullScreen, &QToolButton::clicked, this, [=] {

View File

@@ -16,6 +16,9 @@ public:
explicit DefaultToolBar(QWidget *parent = nullptr);
~DefaultToolBar();
void resetNeedCheckFunctionButtons();
signals:
void openFile();
void openFolder();
@@ -27,7 +30,7 @@ signals:
void negativeWindow();
void fusion(bool on = false);
void cine(bool on = false);
void activeMeasure();
void changeSliceOrientation();
void clear();
void parentWindowStateChange(Qt::WindowState state);
void parentWindowClose();
@@ -40,6 +43,7 @@ private:
void initButtons();
void syncStateChanged() const;
void SetupMPR();
void SetupFileTool();
void SetupImportTool();

View File

@@ -9,7 +9,6 @@
#include "Interaction/ActorDraggableInteractorStyle.h"
#include "UI/Manager/ImageViewManager.h"
#include "UI/Widget/ToolBar/DefaultToolBar.h"
#include "UI/Widget/Component/gridpopwidget.h"
#include "UI/Widget/cine/pqVCRToolbar.h"
@@ -46,16 +45,7 @@ QDicomViewer::~QDicomViewer() {
}
void QDicomViewer::Initial() {
SetupFileTool();
SetupImportTool();
SetupExportTool();
SetupGridTool();
SetupSyncTool();
SetupTransformTool();
SetupEmptyTool();
SetupScreenTool();
// this->createToolButton();
// this->SetupConnections();
this->SetupConnections();
}
void QDicomViewer::loadStyleSheet(const QString &sheetName) {
@@ -68,155 +58,38 @@ void QDicomViewer::loadStyleSheet(const QString &sheetName) {
}
}
void QDicomViewer::createToolButton() {
void QDicomViewer::SetupConnections() {
this->SetupFileTool();
this->SetupImportTool();
this->SetupExportTool();
initGeneralTool();
initViewOperation();
initCine();
initScreenControl();
this->SetupGridTool();
this->SetupSyncTool();
this->SetupAnnoTool();
this->SetupAdjustTool();
this->SetupMeasureTool();
this->SetupEmptyTool();
this->SetupTransformTool();
this->SetupFusionTool();
this->SetupCineTool();
// connect(btnMPR, &QToolButton::clicked, [=](){
// SyncHelper::setSyncState(DIS_SYNC);
// syncStateChanged();
// ui->viewContainer->getViewManager()->switchSliceOrientation();
// });
// btnMPR->setEnabled(false);
// mprBtn = btnMPR;
// fusionBtn = btnfusion;
// connect(ui->viewContainer->getViewManager(),
// &ImageViewManager::currentViewReload,[=](){
// btnfusion->setEnabled(false);
// btnMPR->setEnabled(false);
// SyncHelper::setSyncState(DIS_SYNC);
// syncStateChanged();
// });
connect(ui->viewContainer->getViewManager(),&ImageViewManager::currentViewReload,
ui->toolBar, &DefaultToolBar::resetNeedCheckFunctionButtons);
worker.setManager(ui->viewContainer->getViewManager());
connect(ui->viewContainer->getViewManager(),
&ImageViewManager::currentViewReload,
&worker,&ImageViewStateCheckWorker::checkImageViewState, Qt::QueuedConnection);
connect(&worker,&ImageViewStateCheckWorker::imageViewStateChanged,
this,&QDicomViewer::resetToolBarButtons, Qt::QueuedConnection);
// connect(&worker,&ImageViewStateCheckWorker::imageViewStateChanged,
// this,&QDicomViewer::resetToolBarButtons, Qt::QueuedConnection);
workerManager.registerWorker(&worker);
}
void QDicomViewer::SetupScreenTool() {
connect(ui->toolBar,&DefaultToolBar::parentWindowStateChange,this,&QDicomViewer::setWindowState);
connect(ui->toolBar,&DefaultToolBar::parentWindowClose, this, &QWidget::close);
}
//通知左侧的缩略图bar 当前选中series的变换
connect(ui->viewContainer, &ViewContainerWidget::onThumbnailTrigger,
ui->thumbnailBar, &ThumbnailBarWidget::Slot_setCurrentThumbnail);
void QDicomViewer::SetupAnnoTool() {
// connect(annoBtn, &QToolButton::clicked, this, [=] {
// AnnoHelper::toggleAnno();
// ui->viewContainer->getViewManager()->updateCornerInfoAll();
// });
//通知右侧显示区域当前有series被点击
connect(ui->thumbnailBar, &ThumbnailBarWidget::Signal_ThumbClicked,
ui->viewContainer->getViewManager(), &ImageViewManager::viewReload);
// //视窗操作,显隐测量
// m_measure_hidden_action = m->addAction(tr("Hide all measurements"), this, [=](bool value) {
// Measure::SetHidden(value);
// ui->viewContainer->getViewManager()->renderAll();
// });
//视窗操作,匿名化
// m_patient_hidden_action = m->addAction(tr("Hide patient data"), this, [=] {
// if (m_patient_hidden_action->isChecked()) {
// AnnoHelper::PrivacyOn();
// } else {
// AnnoHelper::PrivacyOff();
// }
// ui->viewContainer->getViewManager()->updateCornerInfoPrivacy();
// });
// m_patient_hidden_action->setCheckable(true);
// m_patient_hidden_action->setChecked(false);
connect(ui->toolBar,&DefaultToolBar::showMeta, this, [&] {
DicomImageView *curV = ui->viewContainer->getCurrentView();
if (curV->hasSeries()) {
curV->showMetaData();
}
});
}
//AnnotationActor执行相关
void QDicomViewer::SetupMeasureTool() {
#define ADD_MEASURE_ACTION(index)\
m->addAction(tr(std::get<0>(MEASURE_ACTIIONS[index])), this, [=] {\
measureBtn->setChecked(true);\
QPixmap map(std::get<1>(MEASURE_ACTIIONS[index]));\
measureBtn->setIcon(QIcon(map));\
MeasureHelper::setMeasureType(std::get<2>(MEASURE_ACTIIONS[index]));\
ui->viewContainer->getViewManager()->activeMeasure();\
})
#define ADD_DEL_ACTION(text, type, func)\
m->addAction(tr(text), this, [=] {\
measureBtn->setChecked(true);\
m_cur_measure = type;\
DicomImageView* curV = ui->viewContainer->getCurrentView();\
if (curV != nullptr)\
{\
curV->func();\
}\
})
// measureBtn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
// measureBtn->setToolTip(QString("Measurements"));
//
// connect(measureBtn, &QToolButton::clicked, this, &QDicomViewer::executeActiveMeasure);
//
// QMenu *m;
// m = new QMenu(this);
//
// for (int j = 0; j < ACTION_COUNT; ++j) {
// ADD_MEASURE_ACTION(j);
// }
// m->addSeparator();
// ADD_DEL_ACTION("Delete selected", AnnotationActorType::DeleteSelectedAnn, deleteSelectedMeasure);
// ADD_DEL_ACTION("Delete all in current slice", AnnotationActorType::DeleteSliceAnn, deleteCurrentSliceMeasure);
// ADD_DEL_ACTION("Delete all in current series", AnnotationActorType::DeleteSeriesAnn, deleteCurrentSeriesMeasure);
// measureBtn->setPopupMode(QToolButton::MenuButtonPopup);
// measureBtn->setMenu(m);
}
void QDicomViewer::executeActiveMeasure() {
ui->viewContainer->getViewManager()->activeMeasure();
DicomImageView *curV = ui->viewContainer->getCurrentView();
switch (MeasureHelper::getMeasureType()) {
case AnnotationActorType::DeleteSelectedAnn:
if (curV != nullptr) {
curV->deleteSelectedMeasure();
}
break;
case AnnotationActorType::DeleteSliceAnn:
if (curV != nullptr) {
curV->deleteCurrentSliceMeasure();
}
break;
case AnnotationActorType::DeleteSeriesAnn:
if (curV != nullptr) {
curV->deleteCurrentSeriesMeasure();
}
break;
default:
ui->viewContainer->getViewManager()->activeMeasure();
break;
}
connect(ui->toolBar, &QToolBar::visibilityChanged,
this, &QDicomViewer::Slot_ToolbarVisibilityChanged);
}
//视窗操作,播放相关
void QDicomViewer::SetupCineTool() {
void QDicomViewer::initCine() {
connect(ui->toolBar, &DefaultToolBar::cine, this, [&] {
DicomImageView *curV = ui->viewContainer->getCurrentView();
if (curV->hasSeries()) {
@@ -241,15 +114,14 @@ void QDicomViewer::createVCRToolbar(DicomImageView *v) {
v->setVCRToolbar(vcr_toolbar);
}
//视窗操作fusion相关
void QDicomViewer::SetupFusionTool() {
connect(ui->toolBar, &DefaultToolBar::fusion, ui->viewContainer->getViewManager(), &ImageViewManager::switchFusion);
}
//视窗操作wwwl
void QDicomViewer::SetupAdjustTool() {
connect(ui->toolBar, &DefaultToolBar::modeChanged, ui->viewContainer->getViewManager(), &ImageViewManager::setInteractionMode);
void QDicomViewer::initViewOperation() {
// operation mode change
connect(ui->toolBar, &DefaultToolBar::modeChanged, [=](int mode) {
printf("mode:%d\r\n",mode);
ui->viewContainer->getViewManager()->setInteractionMode(mode);
});
// custom window level
connect(ui->toolBar, &DefaultToolBar::customWindow, [=]() {
if (nullptr == m_customwin) {
m_customwin = new Customwindow(this);
@@ -259,24 +131,17 @@ void QDicomViewer::SetupAdjustTool() {
m_customwin->setModal(true);
m_customwin->exec();
});
// negative window
connect(ui->toolBar, &DefaultToolBar::negativeWindow, [=]() {
DicomImageView *curV = ui->viewContainer->getViewManager()->getCurrentView();
if (curV != nullptr && curV->hasSeries()) {
curV->negativeWindow();
}
});
}
//视窗操作clear
void QDicomViewer::SetupEmptyTool() {
connect(ui->toolBar, &DefaultToolBar::clear,
ui->viewContainer->getViewManager(), &ImageViewManager::clearCurrentView);
}
//视窗操作flip and rotation
void QDicomViewer::SetupTransformTool() {
// fusion
connect(ui->toolBar, &DefaultToolBar::fusion,
ui->viewContainer->getViewManager(), &ImageViewManager::switchFusion);
// transform
connect(ui->toolBar, &DefaultToolBar::transform,[=](TransFormType type){
DicomImageView *curV = ui->viewContainer->getCurrentView();
if (curV != nullptr && curV->hasSeries()) {
@@ -304,50 +169,14 @@ void QDicomViewer::SetupTransformTool() {
}
}
});
}
//视窗操作sync mode
void QDicomViewer::SetupSyncTool() {
connect(EventsCenter::Default(), &EventsCenter::SyncStateChanged, this, &QDicomViewer::syncStateChanged);
}
void QDicomViewer::syncStateChanged() const {
if (!syncBtn) return;
switch (SyncHelper::getSyncState()) {
case AUTO_SYNC:
// syncBtn->setIcon(mAutoIcon);
m_sync_state_action->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[AUTO_SYNC]));
for (int i = 0; i < SYNC_ITEM_NUM; i++) {
m_sync_item_action[i]->setDisabled(false);
}
m_sync_item_action[SLICE_POS]->setChecked(SyncHelper::getSyncItem(SLICE_POS));
m_sync_item_action[WIDTH_LEVEL]->setChecked(SyncHelper::getSyncItem(WIDTH_LEVEL));
m_sync_item_action[ZOOM_PAN]->setChecked(SyncHelper::getSyncItem(ZOOM_PAN));
break;
case MANUAL_SYNC:{
// syncBtn->setIcon(mManualIcon);
m_sync_state_action->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[MANUAL_SYNC]));
m_sync_item_action[SLICE_POS]->setChecked(SyncHelper::getSyncItem(SLICE_POS));
m_sync_item_action[WIDTH_LEVEL]->setChecked(SyncHelper::getSyncItem(WIDTH_LEVEL));
m_sync_item_action[ZOOM_PAN]->setChecked(SyncHelper::getSyncItem(ZOOM_PAN));
break;
}
case DIS_SYNC:
// syncBtn->setIcon(mDisIcon);
m_sync_state_action->setText(QString(tr("CUR STATE: %1")).arg(SyncHelper::SyncStateName[DIS_SYNC]));
for (int i = 0; i < SYNC_ITEM_NUM; i++) {
m_sync_item_action[i]->setChecked(false);
m_sync_item_action[i]->setDisabled(true);
}
break;
default:
break;
}
// MPR
connect(ui->toolBar, &DefaultToolBar::changeSliceOrientation,
ui->viewContainer->getViewManager(), &ImageViewManager::switchSliceOrientation);
}
//视窗操作file open相关
void QDicomViewer::SetupFileTool() {
void QDicomViewer::initGeneralTool() {
// open dir
connect(ui->toolBar,&DefaultToolBar::openFolder, [&] {
QString p = QFileDialog::getExistingDirectory(this, tr("Open dicom directory"),
m_qs.value("DIR_PATH_ID").toString());
@@ -356,20 +185,15 @@ void QDicomViewer::SetupFileTool() {
openDICOM(p.toLocal8Bit().toStdString(), DIR_OPEN_MODE);
}
});
// openfile
connect(ui->toolBar,&DefaultToolBar::openFile, [&] {
//QSettings s;
//QString p = s.value(FILE_PATH_ID).toString();
QString fn = QFileDialog::getOpenFileName(this, tr("Open dicom files"), m_qs.value("FILE_PATH_ID").toString());
if (!fn.isEmpty()) {
m_qs.setValue("FILE_PATH_ID", fn);
openDICOM(fn.toLocal8Bit().toStdString(), FILE_OPEN_MODE);
}
});
}
void QDicomViewer::SetupImportTool() {
// import
connect(ui->toolBar, &DefaultToolBar::import, this, [&] {
if (nullptr == m_import) {
m_import = new ImportWidget(this);
@@ -377,10 +201,7 @@ void QDicomViewer::SetupImportTool() {
}
m_import->show();
});
}
void QDicomViewer::SetupExportTool() {
// export
connect(ui->toolBar, &DefaultToolBar::save, this, [=] {
if (nullptr == exportDialog) {
exportDialog = new ExportDialog(this);
@@ -389,16 +210,14 @@ void QDicomViewer::SetupExportTool() {
}
exportDialog->show();
});
// open meta dialog
connect(ui->toolBar,&DefaultToolBar::showMeta, this, [&] {
DicomImageView *curV = ui->viewContainer->getCurrentView();
if (curV->hasSeries()) {
curV->showMetaData();
}
void QDicomViewer::displayThumbnailBar(bool value) {
// VCRHelper::setThumbnailbar(value);
// ui->thumbnailBar->setVisible(value);
// m_preview_display_action->setChecked(value);
}
void QDicomViewer::SetupGridTool() {
// connect
});
// layout
connect(ui->toolBar, &DefaultToolBar::showGrid, this, [=](QToolButton* btn) {
// auto delete while hidden
GridPopWidget *gpw = new GridPopWidget(btn);
@@ -407,20 +226,19 @@ void QDicomViewer::SetupGridTool() {
gpw->move(this->geometry().topLeft() + btn->geometry().bottomLeft() + QPoint(5, 5));
gpw->show();
});
// clear view window
connect(ui->toolBar, &DefaultToolBar::clear,
ui->viewContainer->getViewManager(), &ImageViewManager::clearCurrentView);
}
void QDicomViewer::SetupConnections() {
//通知左侧的缩略图bar 当前选中series的变换
connect(ui->viewContainer, &ViewContainerWidget::onThumbnailTrigger,
ui->thumbnailBar, &ThumbnailBarWidget::Slot_setCurrentThumbnail);
//通知右侧显示区域当前有series被点击
connect(ui->thumbnailBar, &ThumbnailBarWidget::Signal_ThumbClicked,
ui->viewContainer->getViewManager(), &ImageViewManager::viewReload);
connect(ui->toolBar, &QToolBar::visibilityChanged,
this, &QDicomViewer::Slot_ToolbarVisibilityChanged);
void QDicomViewer::displayThumbnailBar(bool value) {
VCRHelper::setThumbnailbar(value);
ui->thumbnailBar->setVisible(value);
}
void QDicomViewer::initScreenControl() {
connect(ui->toolBar,&DefaultToolBar::parentWindowStateChange,this,&QDicomViewer::setWindowState);
connect(ui->toolBar,&DefaultToolBar::parentWindowClose, this, &QWidget::close);
}
void QDicomViewer::Slot_ToolbarVisibilityChanged(bool visible) {
@@ -455,10 +273,9 @@ void QDicomViewer::openDICOM(const std::string &dicomName, SeriesOpenMode openMo
void QDicomViewer::resetToolBarButtons(ViewFunctionState state) {
fusionBtn->setEnabled(state.canFusion);
mprBtn->setEnabled(state.canMPR);
// fusionBtn->setEnabled(state.canFusion);
// mprBtn->setEnabled(state.canMPR);
SyncHelper::setSyncState(state.canSync?AUTO_SYNC:DIS_SYNC);
syncStateChanged();
}

View File

@@ -41,30 +41,18 @@ private:
*/
void Initial();
void createToolButton();
/**
* 用于设置ToolButton相关的属性文字、图标、槽等的一组函数
* @{
*/
void SetupFileTool();
void SetupImportTool();
void SetupExportTool();
void initGeneralTool();
void SetupGridTool();
void SetupSyncTool();
void SetupAnnoTool();
void initViewOperation();
void SetupAdjustTool();
void SetupMeasureTool();
void SetupTransformTool();
void SetupFusionTool();
void SetupCineTool();
void SetupEmptyTool();
void initCine();
void SetupScreenTool();
void initScreenControl();
//@}
/**
@@ -86,11 +74,6 @@ private:
*/
void SetupConnections();
/**
* 按照annType的类型在Container中执行对应的Measurement操作
*/
void executeActiveMeasure();
/**
* 为对应的DicomImageView构建对应的播放控件
* @param v
@@ -99,25 +82,13 @@ private:
void resetToolBarButtons(ViewFunctionState state);
QToolButton* syncBtn = nullptr;
QToolButton* fusionBtn = nullptr;
QToolButton* mprBtn = nullptr;
QAction *m_sync_item_action[SYNC_ITEM_NUM];
QAction* m_sync_state_action;
QAction* m_measure_hidden_action;
QAction* m_patient_hidden_action;
ExportDialog *exportDialog = nullptr;
ImportWidget *m_import =nullptr;
QSettings m_qs;
Customwindow *m_customwin =nullptr;
AnnotationActorType m_cur_measure = AnnotationActorType::RulerAnn;
WorkerManager workerManager;
ImageViewStateCheckWorker worker;
void syncStateChanged() const;
};