feat: Add CECHO test to pacs configuratuon

This commit is contained in:
kradchen
2025-09-09 08:52:24 +08:00
parent 046c8345f8
commit a216287ce5
7 changed files with 190 additions and 14 deletions

View File

@@ -0,0 +1,38 @@
#include "ConnectionTestDialog.h"
#include <QPushButton>
#include "PACS/Network/EchoWorker.h"
ConnectionTestDialog::ConnectionTestDialog(QWidget *aParent)
:QMessageBox(QMessageBox::Icon::Information,tr("Connection Testing"),tr("Connecting......"),QMessageBox::StandardButton::Ok,aParent)
,mWorker(new EchoWorker())
{
setDefaultButton(QMessageBox::Ok);
defaultButton()->setEnabled(false);
}
ConnectionTestDialog::~ConnectionTestDialog()
{
}
void ConnectionTestDialog::startTest(const QString &aLocalAE, const QString &aRemoteAE, const QString &aRemoteIP, unsigned long aPort)
{
mWorker->setPacsInfo(aLocalAE.toStdString(), aRemoteAE.toStdString(), aRemoteIP.toStdString(), aPort);
connect(mWorker, &EchoWorker::notifyDone,this,&ConnectionTestDialog::processResult,Qt::QueuedConnection);
mWorker->execute();
}
void ConnectionTestDialog::processResult(int aResult)
{
if (aResult)
{
setText(tr("Success!"));
}
else{
setText(tr("Fail!"));
}
defaultButton()->setEnabled(true);
}

View File

@@ -0,0 +1,20 @@
#ifndef CONNECTION_TEST_DIALOG
#define CONNECTION_TEST_DIALOG
#include <QMessageBox>
class EchoWorker;
class ConnectionTestDialog: public QMessageBox
{
Q_OBJECT
public:
explicit ConnectionTestDialog(QWidget* aParent);
~ConnectionTestDialog();
void startTest(const QString& aLocalAE, const QString& aRemoteAE, const QString& aRemoteIP, unsigned long aPort);
private:
void processResult(int);
EchoWorker* mWorker;
};
#endif /* AC8F73C3_2A4E_4858_A81B_42D2D87198A3 */

View File

@@ -0,0 +1,65 @@
#include "EchoWorker.h"
#include <dcmtk/dcmnet/scu.h>
#include <QThreadPool>
EchoWorker::EchoWorker(QObject *parent)
: QObject(parent)
, QRunnable()
{
}
EchoWorker::~EchoWorker()
{
delete mScu;
}
void EchoWorker::setPacsInfo(const std::string &aAETitle, const std::string &aRemoteTitle, const std::string &aRemoteIP, unsigned long aRemotePort)
{
mAETitle = aAETitle;
mRemoteAETitle = aRemoteTitle;
mRemoteIP = aRemoteIP;
mRemotePort = aRemotePort;
}
void EchoWorker::execute()
{
QThreadPool::globalInstance()->start(this);
}
void EchoWorker::run()
{
mScu = new DcmSCU();
mScu->setMaxReceivePDULength(ASC_DEFAULTMAXPDU);
mScu->setACSETimeout(3);
mScu->setDIMSEBlockingMode(DIMSE_BLOCKING);
mScu->setDIMSETimeout(3);
mScu->setAETitle(mAETitle);
mScu->setPeerHostName(mRemoteIP);
mScu->setPeerPort(OFstatic_cast(Uint16, mRemotePort));
mScu->setPeerAETitle(mRemoteAETitle);
mScu->setConnectionTimeout(3);
OFList<OFString> syntaxes;
syntaxes.push_back(UID_LittleEndianExplicitTransferSyntax);
mScu->addPresentationContext(UID_VerificationSOPClass, syntaxes);
OFCondition cond = mScu->initNetwork();
if (cond.bad())
{
emit notifyDone(0);
return;
}
cond = mScu->negotiateAssociation();
if (cond.bad())
{
emit notifyDone(0);
return;
}
cond = mScu->sendECHORequest(mScu->findPresentationContextID(UID_VerificationSOPClass,""));
if (cond.bad()){
emit notifyDone(0);
return;
}
mScu->releaseAssociation();
emit notifyDone(1);
return;
}

View File

@@ -0,0 +1,31 @@
#ifndef _ECHOWORKER_H
#define _ECHOWORKER_H
#include <QObject>
#include <QRunnable>
class DcmSCU;
class EchoWorker : public QObject, QRunnable
{
Q_OBJECT
public:
explicit EchoWorker(QObject *parent = Q_NULLPTR);
~EchoWorker();
void setPacsInfo(const std::string& aAETitle, const std::string& aRemoteTitle, const std::string& aRemoteIP, unsigned long aRemotePort);
void execute();
void run() override;
signals:
void notifyDone(int);
private:
std::string mRemoteIP;
unsigned long mRemotePort;
std::string mRemoteAETitle;
unsigned long mLocalPort;
std::string mAETitle;
DcmSCU* mScu;
};
#endif // ECHOCLIENT_H

View File

@@ -13,6 +13,7 @@
#include <QItemSelectionModel> #include <QItemSelectionModel>
#include <QHeaderView> #include <QHeaderView>
#include "PACS/Dialog/promptdialog.h" #include "PACS/Dialog/promptdialog.h"
#include "PACS/Dialog/ConnectionTestDialog.h"
ConfigurationDialog::ConfigurationDialog(QWidget *parent) ConfigurationDialog::ConfigurationDialog(QWidget *parent)
: QDialog(parent) : QDialog(parent)
@@ -31,7 +32,7 @@ ConfigurationDialog::ConfigurationDialog(QWidget *parent)
, m_pDelButton(nullptr) , m_pDelButton(nullptr)
, m_pPacsInfo(nullptr) , m_pPacsInfo(nullptr)
, m_pPacsMenu(nullptr) , m_pPacsMenu(nullptr)
, m_pRetriveProtocolMenu(nullptr) , m_TestConnectionMenu(nullptr)
, m_pEditWidget(nullptr) , m_pEditWidget(nullptr)
, m_pEditLayout(nullptr) , m_pEditLayout(nullptr)
, m_pPeerIpAddressLabel(nullptr) , m_pPeerIpAddressLabel(nullptr)
@@ -127,20 +128,18 @@ void ConfigurationDialog::initUi()
m_pPacsInfo->setSelectionBehavior(QAbstractItemView::SelectRows); m_pPacsInfo->setSelectionBehavior(QAbstractItemView::SelectRows);
m_pPacsInfo->setModel(m_pPacsModel); m_pPacsInfo->setModel(m_pPacsModel);
m_pPacsInfo->setMinimumHeight(123); m_pPacsInfo->setMinimumHeight(123);
connect(m_pPacsInfo,&QTableView::customContextMenuRequested,this,&ConfigurationDialog::pacsMenuRequest); connect(m_pPacsInfo,&QTableView::customContextMenuRequested,this,&ConfigurationDialog::pacsMenuRequest);
m_pMainLayout->addWidget(m_pPacsInfo); m_pMainLayout->addWidget(m_pPacsInfo);
m_pPacsMenu = new QMenu(m_pPacsInfo); m_pPacsMenu = new QMenu(m_pPacsInfo);
m_pRetriveProtocolMenu = new QMenu(tr("Retrieval Protocol"),m_pPacsMenu); QAction* cTestAction = new QAction("Test connection",m_pPacsMenu);
QAction* cGetAction = new QAction("C-GET",m_pRetriveProtocolMenu); connect(cTestAction, &QAction::triggered,[=](){
cGetAction->setCheckable(true); ConnectionTestDialog testDialog(this);
connect(cGetAction,&QAction::triggered,this,&ConfigurationDialog::changeHostProtocol); // testDialog.setModal(true);
QAction* cMoveAction = new QAction("C-MOVE",m_pRetriveProtocolMenu); testDialog.startTest(m_pOurTitleEdit->text(), m_pPeerTitleEdit->text(), m_pPeerIpAddressEdit->text(),
cMoveAction->setCheckable(true); m_pPeerPortEdit->text().toULong());
connect(cMoveAction,&QAction::triggered,this,&ConfigurationDialog::changeHostProtocol); testDialog.exec();
m_pRetriveProtocolMenu->addAction(cGetAction); });
m_pRetriveProtocolMenu->addAction(cMoveAction); m_pPacsMenu->addAction(cTestAction);
m_pPacsMenu->addMenu(m_pRetriveProtocolMenu);
m_pEditWidget = new QWidget(this); m_pEditWidget = new QWidget(this);
m_pEditLayout = new QGridLayout(this); m_pEditLayout = new QGridLayout(this);

View File

@@ -73,7 +73,7 @@ private:
QPushButton *m_pDelButton; QPushButton *m_pDelButton;
QTableView *m_pPacsInfo; QTableView *m_pPacsInfo;
QMenu* m_pPacsMenu; QMenu* m_pPacsMenu;
QMenu* m_pRetriveProtocolMenu; QMenu* m_TestConnectionMenu;
QWidget *m_pEditWidget; QWidget *m_pEditWidget;
QGridLayout *m_pEditLayout; QGridLayout *m_pEditLayout;
QLabel *m_pPeerIpAddressLabel; QLabel *m_pPeerIpAddressLabel;

View File

@@ -111,6 +111,29 @@
<translation>PACS配置</translation> <translation>PACS配置</translation>
</message> </message>
</context> </context>
<context>
<name>ConnectionTestDialog</name>
<message>
<location filename="../src/PACS/Dialog/ConnectionTestDialog.cpp" line="9"/>
<source>Connection Testing</source>
<translation>"连接测试"</translation>
</message>
<message>
<location filename="../src/PACS/Dialog/ConnectionTestDialog.cpp" line="9"/>
<source>Connecting......</source>
<translation>"连接中......"</translation>
</message>
<message>
<location filename="../src/PACS/Dialog/ConnectionTestDialog.cpp" line="32"/>
<source>Success!</source>
<translation >"连接成功!"</translation>
</message>
<message>
<location filename="../src/PACS/Dialog/ConnectionTestDialog.cpp" line="35"/>
<source>Fail!</source>
<translation>"连接失败!"</translation>
</message>
</context>
<context> <context>
<name>Customwindow</name> <name>Customwindow</name>
<message> <message>