From 533c15d57cafdc0e45dda323043b02899a397bed Mon Sep 17 00:00:00 2001 From: Krad Date: Thu, 14 Oct 2021 14:39:52 +0800 Subject: [PATCH] Change UI logic, add message prompt, add scan logic and preivewing rendering logic. --- src/ScanFormWidget.cpp | 49 ++++++++++++++++++++++++-- src/device/DeviceManager.cpp | 67 ++++++++++++++++++++---------------- src/guimessagedialog.cpp | 22 ++++++++---- src/guimessagedialog.h | 2 ++ src/mainwindow.cpp | 37 +++++++++++++++++--- 5 files changed, 133 insertions(+), 44 deletions(-) diff --git a/src/ScanFormWidget.cpp b/src/ScanFormWidget.cpp index 8796b5d..afe8709 100644 --- a/src/ScanFormWidget.cpp +++ b/src/ScanFormWidget.cpp @@ -11,13 +11,16 @@ #include "patientinformationform.h" #include #include "event/EventCenter.h" +#include +#include ScanFormWidget::ScanFormWidget(QWidget *parent) : TabFormWidget(parent) { const char* style="QWidget#PatientInformationForm{min-width:300px;max-width:300px; margin-right:10}" "QWidget#patientinformation_panel{ border-right:1px solid #0078d8}" "QWidget#patientinformation_panel QLabel{font-size:20px; }" "QWidget#param_widget{min-width:300px;max-width:300px;border-left:1px solid #0078d8}" - "QWidget#broadcast_widget{border:2px solid #515151; border-radius: 20px}" + "QWidget#broadcast_widget{border:2px solid #515151; border-radius: 20px; background-color:black}" + "QWidget#broadcast_widget QLabel{background-color:black}" "QLabel#lbl_protocol{font-size:32px; margin:0; color:silver}" "QLabel#lbl_title,QLabel#lbl_ptitle{font-size:20px;margin:0; border-bottom:1px solid silver}" "QLabel#lbl_end{font-size:20px;margin:0; border-top:1px solid #0078d8}" @@ -123,17 +126,57 @@ ScanFormWidget::ScanFormWidget(QWidget *parent) : TabFormWidget(parent) { connect(EventCenter::Default(),&EventCenter::ResponsePreview,[=](QObject* sender,QObject* data){ setPreviewing(true); }); + connect(EventCenter::Default(),&EventCenter::ResponsePreviewData,[=](QObject* sender,QObject* data){ + if (!data)return; + QByteArray* array = (QByteArray*)data; + uchar* raw_dataptr = (uchar*)array->data(); + uchar c_data[200][200]; + uchar* data_ptr = c_data[0]; + for(int i=0;i<200;i++){ + data_ptr = c_data[i]; + memcpy(data_ptr,raw_dataptr,200); + raw_dataptr += 200; + + } + raw_dataptr = (uchar*)array->data(); + QImage img(c_data[0] , 200, 200, QImage::Format_Grayscale8); + viewer->setFixedSize(800,800); + QPixmap pic = QPixmap::fromImage(img).scaledToHeight(800,Qt::SmoothTransformation); + QPainter painter(&pic); + QPen pen; + pen.setColor(QColor(255,255,0,100)); + pen.setStyle(Qt::DashLine); + pen.setWidth(3); + QFont font("Futura"); + font.setPixelSize(26); + font.setBold(true); + painter.setFont(font); + painter.setPen(pen); + painter.drawLine(29*4,29*4,29*4,171*4); + painter.drawLine(29*4+1,29*4,171*4,29*4); + painter.drawLine(29*4+1,171*4,171*4,171*4); + painter.drawLine(171*4,29*4+1,171*4,171*4-1); + pen.setColor(QColor(255,255,0)); + painter.setPen(pen); + painter.drawText(335,80,"Previewing"); + painter.drawText(29*4,29*4-2,"ROI"); + viewer->setPixmap(pic); + }); connect(EventCenter::Default(),&EventCenter::PatientSelected,[=](QObject* sender,QObject* data){ patient_information->setPatientInformation((PatientInformation*)data); }); connect(btnRefresh,&QToolButton::clicked,[=](){ - EventCenter::Default()->triggerEvent(GUIEvents::RequestEmptyScan, nullptr, nullptr); + QString patientInf(patient_information->getCurrentPatientJsonString(true)); + printf("%s\r\n",patientInf.toStdString().data()); + EventCenter::Default()->triggerEvent(GUIEvents::RequestEmptyScan, nullptr, (QObject*)(&patientInf)); }); connect(btnPreview,&QToolButton::clicked,[=](){ EventCenter::Default()->triggerEvent(GUIEvents::RequestPreviewScan, nullptr, nullptr); }); connect(btnScan,&QToolButton::clicked,[=](){ - EventCenter::Default()->triggerEvent(GUIEvents::RequestPatientScan, nullptr, nullptr); + QString patientInf(patient_information->getCurrentPatientJsonString(false)); + printf("%s\r\n",patientInf.toStdString().data()); + EventCenter::Default()->triggerEvent(GUIEvents::RequestPatientScan, nullptr, (QObject*)(&patientInf)); }); connect(btnStop,&QToolButton::clicked,[=](){ EventCenter::Default()->triggerEvent(GUIEvents::RequestStop, nullptr, nullptr); diff --git a/src/device/DeviceManager.cpp b/src/device/DeviceManager.cpp index 91a76bb..0d2c997 100644 --- a/src/device/DeviceManager.cpp +++ b/src/device/DeviceManager.cpp @@ -6,50 +6,54 @@ #include "../event/EventCenter.h" #include -#define triggerEvent EventCenter::Default()->triggerEvent +#define TRIGGER_EVENT EventCenter::Default()->triggerEvent -const char * getJsonFromPatInf(QObject* obj) +#define THROW_ERROR(errormsg)\ +TRIGGER_EVENT(GUIEvents::GUIErrorRaise, nullptr, (QObject*)&errormsg); + +std::string getJsonFromPatInf(QObject* obj) { - return nullptr; + return ((QString*)obj)->toStdString(); } void DeviceManager::initDevice() { // empty scan - connect(EventCenter::Default(),&EventCenter::RequestEmptyScan,[=](){ - const char * json = ""; - processScan(json); + connect(EventCenter::Default(),&EventCenter::RequestEmptyScan,[=](QObject* sender, QObject* detail){ + std::string json= getJsonFromPatInf(detail); + printf("%s\r\n",json.c_str()); + processScan(json.c_str()); }); // Patient scan connect(EventCenter::Default(),&EventCenter::RequestPatientScan,[=](QObject* sender, QObject* detail){ - const char * json = getJsonFromPatInf(detail); - if (json) + std::string json= getJsonFromPatInf(detail); + printf("%s\r\n",json.c_str()); + if (!json.empty()) { - processScan(json); + processScan(json.c_str()); } }); // stop - connect(EventCenter::Default(),&EventCenter::RequestStop,[=](){ - triggerEvent(GUIEvents::InvokeOperationStart, nullptr, nullptr); + connect(EventCenter::Default(),&EventCenter::RequestStop,[=]() { + TRIGGER_EVENT(GUIEvents::InvokeOperationStart, nullptr, nullptr); StatusInfo inf = GetStatus(); - if (inf.status==SCANING) - { + if (inf.status == SCANING) { //ScanControl fail - if(ScanControl(STOP)) - { - triggerEvent(GUIEvents::GUIErrorRaise, nullptr, nullptr); + if (ScanControl(STOP)) { + QString msg("Stop operation fail!"); + THROW_ERROR(msg); lastStatus = -1; previewing = false; return; } lastStatus = -1; previewing = false; - triggerEvent(GUIEvents::InvokeOperationEnd, nullptr, nullptr); - triggerEvent(GUIEvents::ResponseStop, nullptr, nullptr); } + TRIGGER_EVENT(GUIEvents::InvokeOperationEnd, nullptr, nullptr); + TRIGGER_EVENT(GUIEvents::ResponseStop, nullptr, nullptr); }); // preview connect(EventCenter::Default(),&EventCenter::RequestPreviewScan,[=](){ - triggerEvent(GUIEvents::InvokeOperationStart, nullptr, nullptr); + TRIGGER_EVENT(GUIEvents::InvokeOperationStart, nullptr, nullptr); StatusInfo inf = GetStatus(); if (inf.status==READY) { @@ -59,12 +63,13 @@ void DeviceManager::initDevice() { lastStatus = SCANING; previewing = true; timerID = startTimer(500); - triggerEvent(GUIEvents::ResponsePreview, nullptr, nullptr); - triggerEvent(GUIEvents::InvokeOperationEnd, nullptr, nullptr); + TRIGGER_EVENT(GUIEvents::ResponsePreview, nullptr, nullptr); + TRIGGER_EVENT(GUIEvents::InvokeOperationEnd, nullptr, nullptr); return; } } - triggerEvent(GUIEvents::GUIErrorRaise, nullptr, nullptr); + QString msg(inf.status!=READY?"Can't start preview,Device is not ready!":"Start preview operation fail!"); + THROW_ERROR(msg); }); } @@ -77,20 +82,21 @@ void DeviceManager::timerEvent(QTimerEvent *event) { if(!previewing) { QVariant var(inf.progress); - triggerEvent(GUIEvents::InvokeOperationProgress, nullptr, (QObject*)&var); + TRIGGER_EVENT(GUIEvents::InvokeOperationProgress, nullptr, (QObject*)&var); } //preview scan else{ const char * data = GetPreviewData(); - QByteArray* bytes = new QByteArray(data); - triggerEvent(GUIEvents::ResponsePreviewData, nullptr, (QObject*)bytes); + QByteArray bytes =QByteArray::fromRawData(data,40000); + TRIGGER_EVENT(GUIEvents::ResponsePreviewData, nullptr, (QObject*)(&bytes)); + delete [] data; } } else{ if (lastStatus == SCANING && !errorOccured) { QVariant var(true); - triggerEvent(GUIEvents::InvokeOperationEnd, nullptr, (QObject*)&var); + TRIGGER_EVENT(GUIEvents::InvokeOperationEnd, nullptr, (QObject*)&var); lastStatus = -1; previewing = false; } @@ -106,10 +112,12 @@ void DeviceManager::timerEvent(QTimerEvent *event) { } void DeviceManager::processScan(const char *json) { - triggerEvent(GUIEvents::InvokeOperationStart, nullptr, nullptr); + static QString msg = "Start scan..."; + TRIGGER_EVENT(GUIEvents::InvokeOperationStart, nullptr, (QObject*)&msg); int ret = SetScanInf(json); if (ret){ - triggerEvent(GUIEvents::GUIErrorRaise, nullptr, nullptr); + QString errmsg("Transfer patient information fail!"); + THROW_ERROR(errmsg); return; } StatusInfo inf = GetStatus(); @@ -122,5 +130,6 @@ void DeviceManager::processScan(const char *json) { return; } } - triggerEvent(GUIEvents::GUIErrorRaise, nullptr, nullptr); + QString errmsg("Start scan operation fail!"); + THROW_ERROR(errmsg); } diff --git a/src/guimessagedialog.cpp b/src/guimessagedialog.cpp index db54dce..2cb80f7 100644 --- a/src/guimessagedialog.cpp +++ b/src/guimessagedialog.cpp @@ -30,13 +30,6 @@ GUIMessageDialog::GUIMessageDialog(QWidget *parent) : } frame.append(str); } - connect(EventCenter::Default(),&EventCenter::InvokeOperationEnd,[=](){ - if (timerID != -1){ - killTimer(timerID); - timerID = -1; - } - accept(); - }); } GUIMessageDialog::~GUIMessageDialog() @@ -63,6 +56,7 @@ void GUIMessageDialog::startLoading() { } void GUIMessageDialog::showMessage(QString msg) { + ui->lbl_msg->setVisible(true); ui->lbl_msg->setText(msg); } @@ -70,6 +64,20 @@ void GUIMessageDialog::showExitButton() { ui->btn_main->setVisible(true); disconnect(ui->btn_main); connect(ui->btn_main,&QToolButton::clicked,[=](){ + if (timerID != -1){ + killTimer(timerID); + timerID = -1; + } accept(); }); } + +void GUIMessageDialog::hideMessage() { + ui->lbl_msg->setVisible(false); + ui->lbl_msg->setText(""); +} + +void GUIMessageDialog::hideExitButton() { + ui->btn_main->setVisible(false); + disconnect(ui->btn_main); +} diff --git a/src/guimessagedialog.h b/src/guimessagedialog.h index 3e418c4..3c57168 100644 --- a/src/guimessagedialog.h +++ b/src/guimessagedialog.h @@ -15,7 +15,9 @@ public: explicit GUIMessageDialog(QWidget *parent = nullptr); ~GUIMessageDialog(); void showMessage(QString msg); + void hideMessage(); void showExitButton(); + void hideExitButton(); void startLoading(); void stopLoading(); protected: diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index ac0d9cf..8b8d73a 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -63,8 +63,8 @@ MainWindow::MainWindow(QWidget *parent) : "stop: 0.0 darkgray, stop: 0.5 lightgray, stop: 1.0 darkgray);" "border-radius:20px;border:5px solid #0078d8; }" "QDialog QWidget QWidget{ background:transparent;color:#3078d8}" - "QDialog QWidget QWidget QLabel{ border:1px solid black}" - "QLabel#lbl_progressicon{min-width:75px;max-width:75px;font-size:30px}" + "QDialog QWidget QWidget QLabel{ font-size:30px}" + "QLabel#lbl_progressicon{min-width:75px;max-width:75px;}" "#spacer_1, #spacer_2{min-width:2px;max-width:2px;margin-top:6px;margin-bottom:6px;border-right:1px solid #0078d8;}"//green with 2 ; this->setStyleSheet(style); @@ -90,15 +90,42 @@ MainWindow::MainWindow(QWidget *parent) : this->showFullScreen (); connect(EventCenter::Default(),&EventCenter::GUIErrorRaise,[=](){ if (!msgDialog) msgDialog = new GUIMessageDialog(this); + msgDialog->showMessage("Something went error!"); + msgDialog->showExitButton(); + msgDialog->stopLoading(); msgDialog->show(); }); - connect(EventCenter::Default(),&EventCenter::InvokeOperationStart,[=](){ + connect(EventCenter::Default(),&EventCenter::InvokeOperationStart,[=](QObject*,QObject* msg){ if (!msgDialog) msgDialog = new GUIMessageDialog(this); + if (msg) + { + QString* str = (QString*)msg; + msgDialog->showMessage(*str); + } else{ + msgDialog->hideMessage(); + } + msgDialog->hideExitButton(); + msgDialog->startLoading(); msgDialog->show(); }); + connect(EventCenter::Default(),&EventCenter::InvokeOperationProgress,[=](QObject*,QObject* msg){ + if (!msgDialog) msgDialog = new GUIMessageDialog(this); + if (msg) + { + QVariant* var = (QVariant*)msg; + msgDialog->showMessage(QString("Scanning %1%").arg((int)(var->toFloat()*100.0f))); + } else{ + msgDialog->hideMessage(); + } + msgDialog->hideExitButton(); + msgDialog->show(); + }); + connect(EventCenter::Default(),&EventCenter::InvokeOperationEnd,[=](){ + if (!msgDialog) return; + msgDialog->stopLoading(); + msgDialog->hide(); + }); DeviceManager::Default()->initDevice(); -// GUIMessageDialog* dialog = new GUIMessageDialog(this); -// dialog->show(); } MainWindow::~MainWindow()