diff --git a/CMakeLists.txt b/CMakeLists.txt index 922da11..1db0814 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,11 @@ file(GLOB_RECURSE project_headers ./src/*.h) file(GLOB_RECURSE project_cpps ./src/*.cpp) file(GLOB_RECURSE project_cxx ./src/*.cxx) file(GLOB_RECURSE project_cc ./src/*.cc) +if(UNIX) +file(GLOB_RECURSE project_c ./src/json/*.c) +else(UNIX) file(GLOB_RECURSE project_c ./src/*.c) +endif(UNIX) include_directories(./src/) find_package(Qt5 COMPONENTS Core Widgets Gui OpenGL Sql VirtualKeyboard REQUIRED) @@ -18,8 +22,73 @@ file(GLOB project_uis ./src/*.ui) qt5_wrap_ui(ui_FILES ${project_uis}) file(GLOB project_res ./src/*.qrc) add_executable(${PROJECT_NAME} ${project_headers} ${project_cpps} ${project_cxx} ${project_res} ${project_cc} ${project_c} ${ui_FILES}) +if(UNIX) +link_directories(/usr/local/lib64) +target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Widgets Qt5::Gui Qt5::OpenGL Qt5::Sql Qt5::VirtualKeyboard usct_shim dmapi log4c cunit ctomat hdf5 matio m) +else(UNIX) target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Widgets Qt5::Gui Qt5::OpenGL Qt5::Sql Qt5::VirtualKeyboard) +endif(UNIX) -if(MSVC) +if(MSVC) set_target_properties(${PROJECT_NAME} PROPERTIES VS_DEBUGGER_ENVIRONMENT "path=${Qt5_DIR}/../../../bin/") endif(MSVC) + +if(UNIX) + set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}) + install(TARGETS GUI RUNTIME DESTINATION bin) + set(qt_LIB_DIR ${Qt5_DIR}/../../) + set(CMAKE_INSTALL_BINDIR ${CMAKE_INSTALL_PREFIX}/bin) + # copy project reference file + install(CODE "file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/testdata/img1_v2.bin DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/testdata/img2_v2.bin DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/scripts/GUI.sh DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/src/layouts DESTINATION ${CMAKE_INSTALL_BINDIR})") + # copy reference libs + install(CODE "file(COPY ${qt_LIB_DIR}/libicuuc.so.56.1 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libicuuc.so.56.1 ${CMAKE_INSTALL_BINDIR}/libicuuc.so.56)") + install(CODE "file(COPY ${qt_LIB_DIR}/libicudata.so.56.1 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libicudata.so.56.1 ${CMAKE_INSTALL_BINDIR}/libicudata.so.56)") + install(CODE "file(COPY ${qt_LIB_DIR}/libicui18n.so.56.1 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libicui18n.so.56.1 ${CMAKE_INSTALL_BINDIR}/libicui18n.so.56)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5Core.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5Core.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5Core.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5Quick.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5Quick.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5Quick.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5DBus.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5DBus.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5DBus.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5Sql.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5Sql.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5Sql.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5Gui.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5Gui.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5Gui.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5Svg.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5Svg.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5Svg.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5Network.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5Network.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5Network.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5VirtualKeyboard.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5VirtualKeyboard.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5VirtualKeyboard.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5OpenGL.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5OpenGL.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5OpenGL.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5Widgets.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5Widgets.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5Widgets.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5Qml.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5Qml.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5Qml.so.5)") + install(CODE "file(COPY ${qt_LIB_DIR}/libQt5XcbQpa.so.5.12.0 DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(RENAME ${CMAKE_INSTALL_BINDIR}/libQt5XcbQpa.so.5.12.0 ${CMAKE_INSTALL_BINDIR}/libQt5XcbQpa.so.5)") + # copy qt plugins + set(qt_Plugins_DIR ${Qt5_DIR}/../../../plugins) + install(CODE "file(COPY ${qt_Plugins_DIR}/platforms DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(COPY ${qt_Plugins_DIR}/imageformats DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(COPY ${qt_Plugins_DIR}/virtualkeyboard DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(COPY ${qt_Plugins_DIR}/sqldrivers DESTINATION ${CMAKE_INSTALL_BINDIR})") + # copy qt qml libs + set(qt_QML_DIR ${Qt5_DIR}/../../../qml) + install(CODE "file(COPY ${qt_QML_DIR}/Qt DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(COPY ${qt_QML_DIR}/QtQml DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(COPY ${qt_QML_DIR}/QtQuick DESTINATION ${CMAKE_INSTALL_BINDIR})") + install(CODE "file(COPY ${qt_QML_DIR}/QtQuick.2 DESTINATION ${CMAKE_INSTALL_BINDIR})") + # copy data + # install(CODE "file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/src/db DESTINATION ${CMAKE_INSTALL_BINDIR})") + # add execute permission to sh and program + install(CODE "execute_process(COMMAND chmod +x ./GUI.sh WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)") + install(CODE "execute_process(COMMAND chmod +x ./GUI WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)") +endif(UNIX) diff --git a/database/USCTDB.data b/database/USCTDB.data new file mode 100644 index 0000000..bbc5e60 Binary files /dev/null and b/database/USCTDB.data differ diff --git a/scripts/GUI.sh b/scripts/GUI.sh index 3131388..f63e3ec 100644 --- a/scripts/GUI.sh +++ b/scripts/GUI.sh @@ -1,4 +1,6 @@ #!/bin/sh +# debug标志,可用于试运行的debug +# export QT_DEBUG_PLUGINS=1 # 获取应用名称(如应用名称为app,那么脚本为app.sh appname=`basename $0 | sed s,\.sh$,,` # 获取应用当前目录 @@ -12,4 +14,5 @@ fi # 将当前目录(库所在目录)加入环境变量 LD_LIBRARY_PATH=$dirname export LD_LIBRARY_PATH -# 运行 \ No newline at end of file +# 运行 +$dirname/$appname "$@" \ No newline at end of file diff --git a/scripts/pack.sh b/scripts/pack.sh deleted file mode 100644 index c3757db..0000000 --- a/scripts/pack.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# 发布程序的名称(参数1,执行脚本时输入) -exe=$1 -# 修改输出可执行文件路径(当前路径) -destDir=`pwd` -# ldd将所有依赖库生成字符串组(#注意if后的空格只有一个) -dependenLibsList=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }') -# 将字符串组里面的库拷贝到目标文件夹 -cp $dependenLibsList $destDir \ No newline at end of file diff --git a/src/InputObject.cpp b/src/InputObject.cpp index 4599c03..6a44df1 100644 --- a/src/InputObject.cpp +++ b/src/InputObject.cpp @@ -42,6 +42,10 @@ void InputObject::initUi() min-height:100px;max-height:100px; min-width:500px;max-width:500px;\ border: 2px solid #ef9cba; border-radius:20px;\ font-family:Arial; color:white;margin:0;font-size:36px;}" + "QTextEdit{background-color: rgba(0,0,0,0.5);\ + min-height:300px;max-height:300px; min-width:700px;max-width:700px;\ + border: 2px solid #ef9cba; border-radius:20px;\ + font-family:Arial; color:white;margin:0;font-size:36px;}" "QDateEdit::up-button{image: url(:/up.png);height:15px;}" "QDateEdit::down-button{image:url(:/down.png);height:15px;}" ; @@ -84,6 +88,7 @@ bool InputObject::eventFilter(QObject *obj, QEvent *event) if (obj->objectName() == QString("qt_scrollarea_viewport")) { QTextEdit *_text= qobject_cast(obj->parent()); + if (!_text) return false; if (_text == ui->textEdit) return true; // if (_text->isEnabled()) { diff --git a/src/ShimLib/ShimLib.h b/src/ShimLib/ShimLib.h index 917ab56..c392d34 100644 --- a/src/ShimLib/ShimLib.h +++ b/src/ShimLib/ShimLib.h @@ -10,7 +10,7 @@ extern "C"{ typedef enum { BUSY,// device is preparing for scan READY,// device is ready for scan - SCANING,// device is doing scan + SCANNING,// device is doing scan ERROR// some device inner error are occured } DeviceStatus; @@ -38,11 +38,11 @@ extern int ScanControl(ScanAction actionType); extern StatusInfo GetStatus(); -extern int SetScanInf(const char *jsonString); +extern int SetScanInfo(const char *jsonString,int empty); extern const char *GetPreviewData(); -extern const char *GetDeviceInf(DeviceInfo infoType); +extern const char *GetDeviceInfo(DeviceInfo infoType); #ifdef __cplusplus }; diff --git a/src/device/DeviceManager.cpp b/src/device/DeviceManager.cpp index 2dc1f13..1378592 100644 --- a/src/device/DeviceManager.cpp +++ b/src/device/DeviceManager.cpp @@ -33,7 +33,7 @@ void DeviceManager::initDevice() { 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()); + processScan(json.c_str(), true); }); // Patient scan connect(EventCenter::Default(),&EventCenter::RequestPatientScan,[=](QObject* sender, QObject* detail){ @@ -48,7 +48,7 @@ void DeviceManager::initDevice() { connect(EventCenter::Default(),&EventCenter::RequestStop,[=]() { TRIGGER_EVENT(GUIEvents::InvokeOperationStart, nullptr, nullptr); StatusInfo inf = GetStatus(); - if (inf.status == SCANING) { + if (inf.status == SCANNING) { //ScanControl fail if (ScanControl(STOP)) { QString msg("Stop operation fail!"); @@ -72,7 +72,7 @@ void DeviceManager::initDevice() { //ScanControl if(!ScanControl(PREVIEW_SCAN)) { - lastStatus = SCANING; + lastStatus = SCANNING; previewing = true; timerID = startTimer(500); TRIGGER_EVENT(GUIEvents::ResponsePreview, nullptr, nullptr); @@ -89,9 +89,9 @@ void DeviceManager::timerEvent(QTimerEvent *event) { if (event->timerId() !=deviceInfTimerID) { StatusInfo inf = GetStatus(); - if (inf.status==SCANING) + if (inf.status==SCANNING) { - lastStatus = SCANING; + lastStatus = SCANNING; //normal scan if(!previewing) { @@ -107,7 +107,7 @@ void DeviceManager::timerEvent(QTimerEvent *event) { } } else{ - if (lastStatus == SCANING && !errorOccured) + if (lastStatus == SCANNING && !errorOccured) { QVariant var(true); TRIGGER_EVENT(GUIEvents::InvokeOperationEnd, nullptr, (QObject*)&var); @@ -115,7 +115,7 @@ void DeviceManager::timerEvent(QTimerEvent *event) { previewing = false; } //内部错误,导致Scan停止 - else if (lastStatus == SCANING && errorOccured) + else if (lastStatus == SCANNING && errorOccured) { //正常情况下,设备应该已经调用的错误callback,然后会回归Ready状态,清理lastStatus即可 lastStatus = -1; @@ -124,15 +124,15 @@ void DeviceManager::timerEvent(QTimerEvent *event) { killTimer(timerID); } } else{ - QString temp = QString(GetDeviceInf(MEAN_TEMPERATURE)); + QString temp = QString(GetDeviceInfo(MEAN_TEMPERATURE)); TRIGGER_EVENT(GUIEvents::ResponseDeviceTemperature, nullptr, (QObject*)&temp); } } -void DeviceManager::processScan(const char *json) { +void DeviceManager::processScan(const char *json, bool empty) { static QString msg = "Start scan..."; TRIGGER_EVENT(GUIEvents::InvokeOperationStart, nullptr, (QObject*)&msg); - int ret = SetScanInf(json); + int ret = SetScanInfo(json,empty?1:0); if (ret){ QString errmsg("Transfer patient information fail!"); THROW_ERROR(errmsg); @@ -143,7 +143,7 @@ void DeviceManager::processScan(const char *json) { { //ScanControl fail if(!ScanControl(SCAN)) { - lastStatus = SCANING; + lastStatus = SCANNING; timerID = startTimer(300); return; } diff --git a/src/device/DeviceManager.h b/src/device/DeviceManager.h index 686b58b..0ddd74e 100644 --- a/src/device/DeviceManager.h +++ b/src/device/DeviceManager.h @@ -20,7 +20,7 @@ protected: void timerEvent(QTimerEvent* event) override ; private: - void processScan(const char * json); + void processScan(const char * json,bool empty = false); int timerID = -1; int deviceInfTimerID = -1; int lastStatus=-1; diff --git a/src/editpatientform.cpp b/src/editpatientform.cpp index bd3836a..55e178e 100644 --- a/src/editpatientform.cpp +++ b/src/editpatientform.cpp @@ -55,6 +55,7 @@ EditPatientForm::EditPatientForm(QWidget *parent) : this->setEditEnable(false); emit editAccept(getPatientInformation()); }); + ui->tbx_Dob->setDisplayFormat("yyyy/MM/dd"); } EditPatientForm::~EditPatientForm() diff --git a/src/main.cpp b/src/main.cpp index 2bfa650..024cacf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,9 +8,12 @@ int main(int argc, char *argv[]) qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); qputenv("QT_VIRTUALKEYBOARD_STYLE", QByteArray("retro")); //qputenv("QT_LOGGING_RULES", QByteArray("qt.virtualkeyboard=true")); - qputenv("QT_VIRTUALKEYBOARD_LAYOUT_PATH", "..\\src\\layouts"); + QApplication a(argc, argv); + QString layouts_path = QString(QCoreApplication::applicationDirPath()).append("/layouts"); + qputenv("QT_VIRTUALKEYBOARD_LAYOUT_PATH", QByteArray(layouts_path.toStdString().c_str())); + //a.installEventFilter(obj); InputObject *obj = new InputObject(); diff --git a/src/patientinformationform.cpp b/src/patientinformationform.cpp index 812ba12..6d8c455 100644 --- a/src/patientinformationform.cpp +++ b/src/patientinformationform.cpp @@ -39,11 +39,11 @@ void PatientInformationForm::setProtocol(int type) { const char *PatientInformationForm::getCurrentPatientJsonString(bool empty) { cJSON* root=cJSON_CreateObject(); - cJSON_AddItemToObject(root, "PatientName",cJSON_CreateString(ui->lbl_Name->text().toStdString().data())); - cJSON_AddItemToObject(root, "PatientID",cJSON_CreateString(ui->lbl_ID->text().toStdString().data())); - cJSON_AddItemToObject(root, "PatientSex",cJSON_CreateString(ui->lbl_Sex->text().toStdString().data())); + cJSON_AddItemToObject(root, "PatientName",cJSON_CreateString(ui->lbl_Name->text().replace(' ','.').toStdString().data())); + cJSON_AddItemToObject(root, "PatientID",cJSON_CreateString(ui->lbl_ID->text().replace(' ','.').toStdString().data())); + cJSON_AddItemToObject(root, "PatientSex",cJSON_CreateString(ui->lbl_Sex->text().replace(' ','.').toStdString().data())); cJSON_AddItemToObject(root, "PatientBirthDate", - cJSON_CreateString(ui->lbl_Date->text().replace("/","").replace("-","").toStdString().data())); + cJSON_CreateString(ui->lbl_Date->text().replace("/","").replace("-","").replace(' ','.').toStdString().data())); cJSON_AddItemToObject(root, "Laterality",cJSON_CreateString(currentProtocol?"R":"L")); cJSON_AddItemToObject(root, "EmptyDataFlag",cJSON_CreateNumber(empty?1:0)); cJSON_AddItemToObject(root, "OperatorName",cJSON_CreateString("Bob")); diff --git a/src/tabformwidget.cpp b/src/tabformwidget.cpp index c967f58..442ac84 100644 --- a/src/tabformwidget.cpp +++ b/src/tabformwidget.cpp @@ -10,12 +10,12 @@ TabFormWidget::TabFormWidget(QWidget *parent) : QPixmap img(":/icons/logo.png"); ui->logo->setPixmap(img.scaledToHeight(33,Qt::SmoothTransformation)); - ui->company->setText(QString::fromLocal8Bit("㽭ҽƿƼ")); +// ui->company->setText(QString::fromLocal8Bit("㽭ҽƿƼ")); ui->lbl_msglogo->setPixmap(QPixmap(":/icons/msg.png").scaledToHeight(26,Qt::SmoothTransformation)); // ui->lbl_patlogo->setPixmap(QPixmap(":/icons/patient.png").scaledToHeight(26,Qt::SmoothTransformation)); ui->spacer_2->setVisible(false); QLabel* hosp = new QLabel(this); - hosp->setText(QString::fromLocal8Bit("㽭ѧҽѧԺڶҽԺ ")); +// hosp->setText(QString::fromLocal8Bit("㽭ѧҽѧԺڶҽԺ ")); QLabel* nowDate = new QLabel(this); nowDate->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); QLabel* linkIcon = new QLabel(this);