From 912e523012466ce4125420305fdfae1a72fa2eac Mon Sep 17 00:00:00 2001 From: RCi <15089880081@163.com> Date: Mon, 10 Jun 2024 16:48:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HanddleAI/HandleAiUi-new/back/fileManager.h | 95 +++++++++++- .../front/pages/historyWidget.h | 74 +++++++++ HanddleAI/HandleAiUi-new/globalStruct.h | 4 - HanddleAI/HandleAiUi-new/icon.qrc | 3 + HanddleAI/HandleAiUi-new/icon/history.png | Bin 0 -> 3866 bytes HanddleAI/HandleAiUi-new/icon/home2.png | Bin 0 -> 3195 bytes HanddleAI/HandleAiUi-new/icon/rollback.png | Bin 0 -> 2136 bytes HanddleAI/HandleAiUi-new/mainwindow.cpp | 12 ++ HanddleAI/HandleAiUi-new/mainwindow.h | 3 +- .../uiModule/uiModule_historyListWidget.h | 146 ++++++++++++++++-- .../uiModule/uiModule_imageView.h | 2 + .../uiModule/uiModule_menuListWdiget.h | 134 ++++++++++++++++ lib/Hd_3DCameraLMI_module_PointLazer.exp | Bin 798 -> 772 bytes lib/Hd_3DCameraLMI_module_PointLazer.lib | Bin 2276 -> 2276 bytes lib/Hd_DalsaCamera_module.exp | Bin 777 -> 751 bytes lib/Hd_DalsaCamera_module.lib | Bin 2120 -> 2120 bytes lib/Hd_FinsTcp_module.exp | Bin 769 -> 743 bytes lib/Hd_FinsTcp_module.lib | Bin 2064 -> 2064 bytes lib/Hd_MvCamera_module_GENTL.exp | Bin 782 -> 756 bytes lib/Hd_MvCamera_module_GENTL.lib | Bin 2164 -> 2164 bytes lib/Hd_MvCamera_module_GIGE.exp | Bin 781 -> 755 bytes lib/Hd_MvCamera_module_GIGE.lib | Bin 2148 -> 2148 bytes lib/Hd_ResultsSummary_module.exp | Bin 782 -> 756 bytes lib/Hd_ResultsSummary_module.lib | Bin 2164 -> 2164 bytes lib/Hd_SocketModule_ModbusTcp.exp | Bin 1527 -> 1501 bytes lib/Hd_SocketModule_ModbusTcp.lib | Bin 3446 -> 3446 bytes 26 files changed, 454 insertions(+), 19 deletions(-) create mode 100644 HanddleAI/HandleAiUi-new/front/pages/historyWidget.h create mode 100644 HanddleAI/HandleAiUi-new/icon/history.png create mode 100644 HanddleAI/HandleAiUi-new/icon/home2.png create mode 100644 HanddleAI/HandleAiUi-new/icon/rollback.png create mode 100644 HanddleAI/HandleAiUi-new/uiModule/uiModule_menuListWdiget.h diff --git a/HanddleAI/HandleAiUi-new/back/fileManager.h b/HanddleAI/HandleAiUi-new/back/fileManager.h index 02706493..381b8ba0 100644 --- a/HanddleAI/HandleAiUi-new/back/fileManager.h +++ b/HanddleAI/HandleAiUi-new/back/fileManager.h @@ -58,8 +58,10 @@ public: /// /// /// - static void getAllFiles(std::string path, std::vector& files, std::string format) + static void getAllFiles(std::string path, std::vector& files, std::string format, int targetDepth = INT_MAX, int depth = 0) { + if (depth >= targetDepth) + return; intptr_t hFile = 0; struct _finddata_t fileinfo; std::string p; @@ -72,7 +74,8 @@ public: if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) { files.push_back(p.assign(path).append("\\").append(fileinfo.name)); - getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, format); + depth++; + getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, format, targetDepth ,depth); } } else @@ -84,6 +87,44 @@ public: } } /// + /// 获取文件夹下的图片,以vector返回 + /// + /// + /// + /// + static void getAllImages(std::string path, std::vector& files, std::string format, int targetDepth = INT_MAX, int depth = 0) + { + if (depth >= targetDepth) + return; + intptr_t hFile = 0; + struct _finddata_t fileinfo; + std::string p; + if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1) + { + do + { + if ((fileinfo.attrib & _A_SUBDIR)) + { + if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) + { + std::string filePath = p.assign(path).append("\\").append(fileinfo.name); + if (fileManager::isImageFile(filePath) == true) + files.push_back(filePath); + depth++; + getAllFiles(filePath, files, format, targetDepth, depth); + } + } + else + { + std::string filePath = p.assign(path).append("\\").append(fileinfo.name); + if (fileManager::isImageFile(filePath) == true) + files.push_back(filePath); + } + } while (_findnext(hFile, &fileinfo) == 0); + _findclose(hFile); + } + } + /// /// 检查磁盘剩余空间,以GB为单位返回 /// /// example"E://""E://111/222"支持文件夹或者磁盘路径 @@ -191,6 +232,56 @@ public: } return true; } + //去除重复分割符 + static QString normalizePathSeparators(const QString& path) { + QString normalizedPath = path; + + // Replace backslashes with forward slashes + normalizedPath.replace('\\', '/'); + + // Remove consecutive forward slashes + QString doubleSlash = "//"; + while (normalizedPath.contains(doubleSlash)) { + normalizedPath.replace(doubleSlash, "/"); + } + + return normalizedPath; + } + + static bool isImageFile(const std::string& filename) { + const std::string imageExtensions[] = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".webp" }; + + std::string lowerFilename = filename; + std::transform(lowerFilename.begin(), lowerFilename.end(), lowerFilename.begin(), [](unsigned char c) { return std::tolower(c); }); + + for (const std::string& ext : imageExtensions) { + if (lowerFilename.size() >= ext.size() && + lowerFilename.compare(lowerFilename.size() - ext.size(), ext.size(), ext) == 0) { + return true; + } + } + + return false; + } + static std::string getFileName(std::string path) + { + return path.substr(path.find_last_of("\\") + 1, path.find_last_of(".") - path.find_last_of("\\") - 1); + } + static QString getFileName(const QString& path) { + int lastSlashIndex = path.lastIndexOf('/'); + if (lastSlashIndex == -1) { + lastSlashIndex = path.lastIndexOf('\\'); + } + + int lastDotIndex = path.lastIndexOf('.'); + + if (lastDotIndex == -1 || lastDotIndex < lastSlashIndex) { + return path.mid(lastSlashIndex + 1); + } + else { + return path.mid(lastSlashIndex + 1, lastDotIndex - lastSlashIndex - 1); + } + } }; /// /// 自动删除文件夹,支持按日期删除,按磁盘剩余容量删除,或者两者都是,请在主线程声明qtimer diff --git a/HanddleAI/HandleAiUi-new/front/pages/historyWidget.h b/HanddleAI/HandleAiUi-new/front/pages/historyWidget.h new file mode 100644 index 00000000..e27daf12 --- /dev/null +++ b/HanddleAI/HandleAiUi-new/front/pages/historyWidget.h @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class historyWidget :public QWidget +{ +public: + QVBoxLayout* Layout = new QVBoxLayout(this); + QHBoxLayout* btnLayout = new QHBoxLayout(this); + std::vectorbtns; + QLabel* icon, * Title; + + QWidget* widgets = new QWidget(); + QGridLayout* mainWidgetLayout = new QGridLayout(widgets); + + ImageWidget imageWidget; + menuListWidget dirListWidget; + historyShowListWidget _historyShowListWidget; + historyWidget() + { + QPalette palette; + palette.setColor(QPalette::WindowText, Qt::white); + QFont font("微软雅黑", 24, QFont::Bold); + QFont font2("微软雅黑", 108, QFont::Bold); + + widgets->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + widgets->setMaximumSize(9999, 9999); + + this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + this->setMaximumSize(9999, 9999); + this->setObjectName("historyWidget"); + + Layout->setContentsMargins(0, 0, 0, 0); + Layout->setAlignment(Qt::AlignLeft | Qt::AlignTop); + + Title = new QLabel(u8"历史图片"); + Title->setFont(font); + Title->setPalette(palette); + Title->setAlignment(Qt::AlignLeft); + + Layout->addWidget(Title); + + btnLayout->setContentsMargins(0, 0, 0, 0); + btnLayout->setAlignment(Qt::AlignLeft); + + Layout->addLayout(btnLayout); + + mainWigetInit(); + Layout->addWidget(widgets); + QObject::connect(&_historyShowListWidget._historyShowListSubThread, &historyShowListSubThread::readImgSignal, &imageWidget, &ImageWidget::showImgOnGraphicsView); + } + void mainWigetInit() + { + imageWidget.setTitle("图片查看"); + mainWidgetLayout->addWidget(&imageWidget , 0, 0); + mainWidgetLayout->setColumnStretch(0, 5); + + mainWidgetLayout->addWidget(&dirListWidget, 0, 1); + mainWidgetLayout->addWidget(&_historyShowListWidget, 0, 2); + mainWidgetLayout->setColumnStretch(1, 1); + mainWidgetLayout->setColumnStretch(2, 2); + + dirListWidget.setStyleSheet("background: transparent;"); + QObject::connect(&dirListWidget, &menuListWidget::switchPathSignal, &_historyShowListWidget, &historyShowListWidget::addImgFromPath); + } +}; +#pragma once \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/globalStruct.h b/HanddleAI/HandleAiUi-new/globalStruct.h index 20a799ee..1c18d956 100644 --- a/HanddleAI/HandleAiUi-new/globalStruct.h +++ b/HanddleAI/HandleAiUi-new/globalStruct.h @@ -101,10 +101,6 @@ static void cvMatToQPixMap(cv::Mat& src,QPixmap& pixmap) { pixmap = QPixmap::fromImage(cvMatToQImage(src)); } -static std::string getFileName(std::string path) -{ - return path.substr(path.find_last_of("\\") + 1, path.find_last_of(".") - path.find_last_of("\\") - 1); -} Q_DECLARE_METATYPE(imgWidgetShowType) Q_DECLARE_METATYPE(cv::Mat*) #pragma once \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/icon.qrc b/HanddleAI/HandleAiUi-new/icon.qrc index ad35f767..ad42f0da 100644 --- a/HanddleAI/HandleAiUi-new/icon.qrc +++ b/HanddleAI/HandleAiUi-new/icon.qrc @@ -23,6 +23,7 @@ icon/fullscreen-exit.png icon/minus.png icon/home.png + icon/home2.png icon/config.png icon/menu.png icon/save.png @@ -33,5 +34,7 @@ icon/loading.gif icon/sql.png icon/error.png + icon/history.png + icon/rollback.png diff --git a/HanddleAI/HandleAiUi-new/icon/history.png b/HanddleAI/HandleAiUi-new/icon/history.png new file mode 100644 index 0000000000000000000000000000000000000000..baa3a5b8eebfc2a7bf7265621e0f4ffee02d1cb8 GIT binary patch literal 3866 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 c$A1^KFgoBl0H(&_%K!iX literal 0 HcmV?d00001 diff --git a/HanddleAI/HandleAiUi-new/icon/home2.png b/HanddleAI/HandleAiUi-new/icon/home2.png new file mode 100644 index 0000000000000000000000000000000000000000..4245af6df89775d693b4673353b75a95650c4733 GIT binary patch literal 3195 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 Y6pzVk{c`XC{F?yGFI>jf8eb>=0}j2#n*aa+ literal 0 HcmV?d00001 diff --git a/HanddleAI/HandleAiUi-new/icon/rollback.png b/HanddleAI/HandleAiUi-new/icon/rollback.png new file mode 100644 index 0000000000000000000000000000000000000000..2346fdfc6dbf28af64205d7bfb2c55036c53d017 GIT binary patch literal 2136 zcmeH}`BPI@6vtn}Lmvv}#ifE!dBHFgQK(`hsVsSHA+c%&ijsmD!D3sK1Vm&hfu{(_ zVhD%}QS7K7RZ~F&QKArPF)j@XNI~`hLW&VLAVMGw)7HPCo%V-&zGvoh&v(w8nRDl6 zeX*HgHgDNH007LGe%}5DRm>h}jv-#%E2X3t?q^X?h_tjiF?PjwXAdilQAnL z;}wN(G{0KAwX(wk>r0PKgYZE870GzxXpeg+DOt6$k{@87OBeXFzPlPmnS9zmnU1h( zx*k7l!a|gmVbO{wJey2TfW298kRV=ZIXZasPb|bbsnJL#$EchT%o3PY2a3>^c%5>l zh&W)w@W`1ciH-W6mn}J7I6PGZUyzJnENmk5Cxt{>@%Z}5RKHvTP zr^OeRkb7knl)&zI*EGimW$cmt+eY?d=KA}J*ZKah_uxbGhT8AQPq75OZyTPZ1w?zK zIWqO9->!=+Sch@D+iE+6c_)8A;E;}pT!j1LrYfi8(@)%W(){N6^?RT4IChs?2%55< zZ+F8N`22oGB{x`HQnz?pzS>wVdOz@>wqs$?u!mnVHL1%UOjyC>tNO;SUsist(DA_K z%9(b*W#|s)-sUUPE-GiRxsjv>Z-#6VTN6LyRIO42_%e@4%0)!9aY0)mjfG^|mAP!$ zH58)4(MGp}G@IhOSSG)6gWec(A~();fK=i7$o-EQ^5pZ6Ed+0!oIu_iea|a^3E#DV zF)D7ko31z31fv>x!gh6+`jk6&oJdEMsUjLTdvJgsuf2KfADFvx0 zy}oUsJ^9=H9ygs+PXYtB;~4xz9POD8{RAKBp`Ji8osn6vS6fUkOH6H#5><)kqE$lH zyE`cq+7t(u#qA1RiCrQytw|tE1|599gpf>@@Ey^xtDe{V0}VUyKm5-QL4h)>THUPz zkFJd+YIRApEe*D_&tOhC!6JxIu3FW^p4!SnVLOJr4>IKbtoJL;9aq0MK_E;UpU*W0 zQMgZ|iPi*M9jmF$xm~Z0gu#l8>N-URd!*5M%3I*9cAf~uOIn*JhSc+W=V7)kkgSDm z-B@}EiL|TJRYRhbnc?|f@cQ8#uvD6eD003!L>co+s7(|lQu(=Q4v=NcdVD}9o1}>9 zz{cJ=`0C}o #include #include +#include #pragma execution_character_set("utf-8") @@ -52,6 +53,7 @@ public: logWidget* _logWidget; sqlControlWidget* _sqlControlWidget; manualDetWidget* _manualDetWidget; + historyWidget* _historyWidget; private: Ui::MainWindow* ui; fbBridge* fbBridgePtr; @@ -98,7 +100,6 @@ public slots: showMinimized(); } - void toggleMaximize(toggleMaximizeEnum toggleMaximizeEnumIn = reverse) { switch (toggleMaximizeEnumIn) diff --git a/HanddleAI/HandleAiUi-new/uiModule/uiModule_historyListWidget.h b/HanddleAI/HandleAiUi-new/uiModule/uiModule_historyListWidget.h index 9e912756..54be4d28 100644 --- a/HanddleAI/HandleAiUi-new/uiModule/uiModule_historyListWidget.h +++ b/HanddleAI/HandleAiUi-new/uiModule/uiModule_historyListWidget.h @@ -4,49 +4,152 @@ #include #include #include -class historyItem : public QWidget +#include +#include +class historyItemWidget : public QWidget { public: QGridLayout* layout = new QGridLayout(this); - QLabel* resultShow = new QLabel("测试测试"); + QLabel* resultLabel = new QLabel(this); + QLabel* fileNameLabel = new QLabel(this); + QLabel* filePathHide = new QLabel(this); + QLabel* imgShow = new QLabel(); - //QIcon* icon = new QIcon(":/topBar/icon/fullscreen.png"); - historyItem() + historyItemWidget(QString title,std::string filePath,QPixmap img , QSize parentSize) { - layout->addWidget(resultShow,0,0); - imgShow->setPixmap(QPixmap(":/topBar/icon/waiting.png")); + if (img.isNull()) + return; + QFont font("微软雅黑", 12, QFont::Bold); + + resultLabel->setText(title); + resultLabel->setFont(font); + resultLabel->setStyleSheet("QLabel { color: white; }"); + layout->addWidget(resultLabel,0,0); + + filePathHide->setText(QString::fromStdString(filePath)); + filePathHide->hide(); + filePathHide->setObjectName("path"); + + fileNameLabel->setText(QString::fromStdString(fileManager::getFileName(filePath))); + fileNameLabel->setFont(font); + fileNameLabel->setStyleSheet("QLabel { color: white; }"); + layout->addWidget(fileNameLabel, 1, 0); + + int iHeight = img.size().height(); + int pHeight = (parentSize.height() / 5); + double widthScale = iHeight / pHeight; + + img = img.scaled(img.size().width() * widthScale, parentSize.height() / 5, Qt::KeepAspectRatio, Qt::SmoothTransformation); + imgShow->setPixmap(img); layout->addWidget(imgShow,0,1); + layout->setContentsMargins(0, 0, 0, 0); } }; +class historyShowListSubThread : public QThread +{ + Q_OBJECT +public: + QMutex queueMutex; + QQueue> queue; + void run() + { + while (queue.size() > 0) + { + queueMutex.lock(); + std::pair data = queue.dequeue(); + queueMutex.unlock(); + if (data.first == 0) + { + cv::Mat mat = cv::imread(data.second, cv::IMREAD_REDUCED_COLOR_8); + if (mat.empty() == true) + continue; + QPixmap map; + cvMatToQPixMap(mat, map); + addDataSignal((data.second.find("OK") != std::string::npos), data.second, map); + } + else if (data.first == 1) + { + cv::Mat mat = cv::imread(data.second, -1); + if (mat.empty() == true) + return; + QPixmap map; + cvMatToQPixMap(mat, map); + emit readImgSignal(map); + } + } + } +public slots: + void asyncReadIcons(std::vector files) + { + for (auto file : files) + { + queueMutex.lock(); + queue.enqueue(std::make_pair(0, file)); + queueMutex.unlock(); + this->start(); + } + } + void asyncReadImg(std::string filePath) + { + queueMutex.lock(); + queue.enqueue(std::make_pair(1, filePath)); + queueMutex.unlock(); + this->start(); + } +signals: + void addDataSignal(bool isOk, std::string filePath, QPixmap img); + void readImgSignal(QPixmap img); +}; class historyShowListWidget : public QWidget { + Q_OBJECT public: QLabel* title = new QLabel(u8"历史记录"); QListWidget* showDataListWidget = new QListWidget(); QVBoxLayout* layout = new QVBoxLayout(this); + historyShowListSubThread _historyShowListSubThread; historyShowListWidget() { QPalette palette; palette.setColor(QPalette::WindowText, Qt::white); - QFont font("微软雅黑", 12, QFont::Bold); + QFont font("微软雅黑", 16, QFont::Bold); QHBoxLayout* hLayout = new QHBoxLayout(); title->setPalette(palette); title->setFont(font); + title->setStyleSheet("QLabel { color: white; }"); layout->addWidget(title); layout->addWidget(showDataListWidget); this->setStyleSheet("background: transparent;"); - - //addData(); + QObject::connect(this, &historyShowListWidget::asyncReadImgSignal, &_historyShowListSubThread, &historyShowListSubThread::asyncReadImg); + QObject::connect(this, &historyShowListWidget::asyncReadIconsSignal, &_historyShowListSubThread, &historyShowListSubThread::asyncReadIcons); + QObject::connect(&_historyShowListSubThread, &historyShowListSubThread::addDataSignal, this, &historyShowListWidget::addData); + QObject::connect(showDataListWidget, &QListWidget::itemClicked, this, &historyShowListWidget::itemClick); } - void addData(bool isOk,QPixmap& img) +public slots: + void addImgFromPath(QString path) { - QWidget* widget = new historyItem(); + std::vector files; + fileManager::getAllImages(path.toStdString(), files, "",1); + if (files.size() == 0) + return; + showDataListWidget->clear(); + emit asyncReadIconsSignal(files); + + } + void addData(bool isOk, std::string filePath, QPixmap img) + { + QString title; + if (isOk == true) + title = "OK"; + else + title = "NG"; + QWidget* widget = new historyItemWidget(title, filePath, img, size()); QListWidgetItem* item = new QListWidgetItem(); showDataListWidget->addItem(item); showDataListWidget->setItemWidget(item, widget); @@ -57,4 +160,23 @@ public: { } -}; \ No newline at end of file +private slots: + void itemClick(QListWidgetItem* item) + { + QWidget* widget = showDataListWidget->itemWidget(item); + const QList labels = widget->findChildren(); + for (const QLabel* label : labels) + { + if (label->objectName() == "path") + { + QString path = label->text(); + emit asyncReadImgSignal(path.toStdString()); + } + } + } +signals: + void asyncReadImgSignal(std::string); + void asyncReadIconsSignal(std::vector); + void itemClickSignal(QString path); +}; +#pragma once \ No newline at end of file diff --git a/HanddleAI/HandleAiUi-new/uiModule/uiModule_imageView.h b/HanddleAI/HandleAiUi-new/uiModule/uiModule_imageView.h index 84805a0b..2eecfee2 100644 --- a/HanddleAI/HandleAiUi-new/uiModule/uiModule_imageView.h +++ b/HanddleAI/HandleAiUi-new/uiModule/uiModule_imageView.h @@ -173,6 +173,7 @@ private: QMutex mutex; }; class ImageWidget : public QWidget { + Q_OBJECT public: ImageWidget(QWidget* parent = nullptr) : QWidget(parent) { QVBoxLayout* layout = new QVBoxLayout(this); @@ -236,6 +237,7 @@ public: void setTitle(const QString& text) { label->setText(text); } +public slots: //set不一定显示,要根据当前显示的类型决定 void setOriImg(QPixmap oriImgInput) { diff --git a/HanddleAI/HandleAiUi-new/uiModule/uiModule_menuListWdiget.h b/HanddleAI/HandleAiUi-new/uiModule/uiModule_menuListWdiget.h new file mode 100644 index 00000000..4503f6f0 --- /dev/null +++ b/HanddleAI/HandleAiUi-new/uiModule/uiModule_menuListWdiget.h @@ -0,0 +1,134 @@ +#include +#include +#include +#include +#include +#include +#include +class toolItemWidget :public QWidget +{ +public: + QHBoxLayout* layout = new QHBoxLayout(this); + fancyButton* returnBtn; + fancyButton* homeBtn; + QLabel* dirLabel = new QLabel(); + toolItemWidget(QString title) + { + QFont font("微软雅黑", 24, QFont::Bold); + QPalette palette; + palette.setColor(QPalette::WindowText, Qt::white); + + returnBtn = new fancyButton(40,40, QIcon(":/topBar/icon/rollback.png"),"返回上一级"); + layout->addWidget(returnBtn); + + homeBtn = new fancyButton(40, 40, QIcon(":/topBar/icon/home2.png"), "返回目录"); + layout->addWidget(homeBtn); + + dirLabel->setText(title); + dirLabel->setFont(font); + dirLabel->setStyleSheet("QLabel { color: white; }"); + + layout->addWidget(dirLabel); + layout->setAlignment(Qt::AlignLeft); + layout->setContentsMargins(0, 0, 0, 0); + } +}; + +class menuListWidget : public QListWidget +{ + Q_OBJECT +public: + QString basePath = bridge.back.json.imgSavePath; + menuListWidget() + { + _toolItemWidget = new toolItemWidget(basePath); + pathList.append(basePath); + refreshListWidget(); + targetDepth = pathList.size(); + _toolItemWidget->returnBtn->setDisabled(true); + _toolItemWidget->homeBtn->setDisabled(true); + QObject::connect(this, &QListWidget::itemClicked, this, &menuListWidget::itemClick); + //jumpWithPath("D://////CCD/yuantu/2024-06-04/23H/TEST"); + } + void addTools(QString title) + { + QListWidgetItem* item = new QListWidgetItem(); + this->addItem(item); + if (_toolItemWidget != nullptr) + delete _toolItemWidget; + _toolItemWidget = new toolItemWidget(title); + item->setSizeHint(_toolItemWidget->sizeHint()); + QObject::connect(_toolItemWidget->returnBtn, &QPushButton::clicked, this, &menuListWidget::returnLast); + QObject::connect(_toolItemWidget->homeBtn, &QPushButton::clicked, this, &menuListWidget::toMenu); + this->setItemWidget(item, _toolItemWidget); + } + void returnLast() + { + if (depth <= targetDepth) + return; + depth--; + pathList.removeLast(); + refreshListWidget(); + if (depth <= targetDepth) + { + _toolItemWidget->returnBtn->setDisabled(true); + _toolItemWidget->homeBtn->setDisabled(true); + } + } + void refreshListWidget() + { + this->clear(); + addTools(pathList.last()); + QString path; + for (auto p : pathList) + path.append(p + "/"); + QFont font("微软雅黑", 18, QFont::Bold); + std::vector result = fileManager::getAllDirs(path); + for (auto dirName : result) + { + QListWidgetItem* item = new QListWidgetItem(QString::fromStdString(dirName)); + item->setFont(font); + item->setForeground(QBrush(QColor(Qt::white))); + this->addItem(item); + } + emit switchPathSignal(path); + } + void toMenu() + { + jumpWithPath(basePath); + } + void jumpWithPath(QString path) + { + //分割字符串 + path = fileManager::normalizePathSeparators(path); + QStringList list = path.split("/"); + if (list.size() == 0) + list = path.split("\\"); + if (list.size() == 0) + return; + + //写入 + pathList.clear(); + depth = list.size() - 1; + for (auto str : list) + pathList.append(str); + + refreshListWidget(); + } +private: + toolItemWidget* _toolItemWidget = nullptr; + int depth = 0,targetDepth = 0; + QLinkedList pathList; +private slots: + void itemClick(QListWidgetItem* item) + { + if (item->text().isEmpty()) + return; + pathList.append(item->text()); + depth++; + refreshListWidget(); + } +signals: + void switchPathSignal(QString path); +}; +#pragma once \ No newline at end of file diff --git a/lib/Hd_3DCameraLMI_module_PointLazer.exp b/lib/Hd_3DCameraLMI_module_PointLazer.exp index 6a8fa414ceecaea4ca722a610fdaee43ee4bd905..d8e955a08830ce97f26c66b802d0659eea1b677e 100644 GIT binary patch delta 179 zcmbQo*22b_(#FK_9|$xiaym1zO!U3a`-6dj!Ipth5J)k2PPSz9s#j-3=gpAKU@ORwT%N+N1 zlA2VS&X8J>%HU!Z6BcY_U}O{%<{T4}pPy44;~NZQ8k*=CTk07bn;KfiBxUBsc;pwC Y0Cj?N$K+(@O_pKOWBS}Q*@x*809VmC6aWAK delta 186 zcmZo+o5#kP(#FK_9|)W#aym20P4vCbE5yjaV9UTL$N&T`lPwv&>NOYyS{N97Gn0$* zi}TY;6f}Y~6?{DXyct>kMOjJ)ML6gX@f9j0}v7Vx0YbeM9|#!eP!aA^G_^ h#WB9YK&GLIi2+-kp`Nj^#pHL4PD}zVlZ}`z0RR#>H~;_u diff --git a/lib/Hd_3DCameraLMI_module_PointLazer.lib b/lib/Hd_3DCameraLMI_module_PointLazer.lib index 36c75b149f315b6d9f39a25471404d60a91a35ae..b04150d66d0bd6f8780c0ea27f1bb8d8c729edd8 100644 GIT binary patch delta 118 zcmaDN_(X8S0VbAz%oEN}KEiaIMV;Yu)8u~UVkRIpi(P879E$-XXW8l7S1&OzFfdI% w$s|3wh_xQ3OnveMb`Gf0$qsCBoC?-nr@ui}noYjT)&o6ylW|Qx-^}tjrLsf2`#qPxj05HBKZU6uP diff --git a/lib/Hd_DalsaCamera_module.exp b/lib/Hd_DalsaCamera_module.exp index da2ea450a2c84bc30541eb82018b267d2007a727..27cfbc168fcf45adf98783ffef0c6a66d4ad2515 100644 GIT binary patch delta 138 zcmeBVd(X<5(#FK_9|(jeaym2pWSHo8h4(E31A`F*qacuC@SLpAXs@i!@VSYB!8bFx zD8D#Atwcd1NK?Vb)6bhBo55C)A-OySsBR*ow605PQfWFvYDFr8i&acmu#th0QB0U~ lOh|ryPH~KHFpz0zqGxQWXKZY0XgT>aqZ8BTrpe|^mjGNtDWm`Z delta 164 zcmaFQ+R4V5(#FK_9|&|Oayl~!Gfwoo!pqLcz+l9{D98W=E|c{c?Ugkc1X>svd^3}a z@{9A+N)$ALG!=Y2{k$1k8Egd^lFL(o>LxNuy9cG_q$U=pGNe|dGB{hs1O)lJ2RYUm z#`tQ*oMS@r^K*)0e1m~ZLlYB&Izv5UV~fc*8J(B} KS|-afT>=2XLoW0H diff --git a/lib/Hd_DalsaCamera_module.lib b/lib/Hd_DalsaCamera_module.lib index cc2d36e5dd6097c8d1dffea4f0e34dc019fb0ad6..9c451b2ec75fbfd47c5b293388f4274cb1b1aa9e 100644 GIT binary patch delta 109 zcmX>ha6({12NTP2)AOe%_b}~YQD^wvG}(taoe4&fp~02Rk5eEha6({12NTODh23{1_b}~Y(O?j0ne4-y&IF|7*`+q0XO?DUVSi@ub@DrwDKJ^} s$!l3TpeiO`WQ}DF@!xsr_2l;~@{`vvNl(sYYlNv(hN|2w&#uV`01D?LO#lD@ diff --git a/lib/Hd_FinsTcp_module.exp b/lib/Hd_FinsTcp_module.exp index 26d6e58176a4f4100cca476b43767d9383296971..8842446e1ca7d74eaf131fa9904afaa3c5dcc781 100644 GIT binary patch delta 138 zcmZo;m delta 164 zcmaFP+Q`P4(#FK_9|%+@aym2dGfwooz{||Yz@W##D98W=E|awxt(7$x1X>svd^3}a z@{9A+N)$ALG!=Y2{k$1k8Egd^lFL(o>N**v-GfqdQWJ|)8B!}!8Jw+R0)qVAgBouQtwvBl(zj804f KEt5r=E&%|di!Q7H diff --git a/lib/Hd_FinsTcp_module.lib b/lib/Hd_FinsTcp_module.lib index a50e177e10f90e3993f56c5a13e462416b8c93d4..f679fdae9df129fa1e4d394f63100284f9d61348 100644 GIT binary patch delta 113 zcmbOrFhO8L2@~f(^@6+dj0_AMllj@qCU0h{Wl?AN+%!3kRef?avkeoF+0QDqc{8&x wBa6wYtap=7u}pxe(1*yDvp75wyE2)JZ3j$3nad$LKes?HGX<)hmz|jr0D+b!iU0rr delta 113 zcmbOrFhO8L2@@y(r?ji`j0_AMllj@qCU0h{Wzk>|Xqg}QqQyqQ^; wk>!eB#hJ;cSSG+!=tE@7S(vllUz^OuwgV=i%;k`rpIe}pnF7_$%g)RQ0BqkOCjbBd diff --git a/lib/Hd_MvCamera_module_GENTL.exp b/lib/Hd_MvCamera_module_GENTL.exp index 6429d839ff9cf356b824c4b9281c91c274e3392b..ebd6dce5c4074d58a4d8a8aeb34c9ed2980064e3 100644 GIT binary patch delta 180 zcmeBU`@+hZ(#FK_9|$BSaym2pVVLN5jrRis1A{38qacuC@SJSO=v1%H@VSYB!8bFx zD8D#Atwcd1NK?Vb)6bhBo55C)A-Oz-!P6=xIkPx9-!VTkG&3f@v?L~}G&3h9rozlb z*CjQnG@T)}B9+0#Dkd!0$iT=bCd@e|BtJi=IL0>^$TT$3Gq%(-Ha0c1j7iGOi}A=W ZE&=KU>5j?C%$v-^q{sBRX|fH|B>)@kITQc@ delta 187 zcmeyu+Q-J3(#FK_9|(*laym1KF;4Wm#>>UXz+lS2D98W=E|U!zo$56h1X>svd^3}a z@{9A+N)$ALG!=Y2{k$1k8Egd^lFL&VT&!Y}GmDe+9rH6oGh^~gOJb5rGjmd6D$GoD zgHm%+6N^(BQY%s!oULL4g8bcs9P12Yd_A3m{DbR^VvG!ojAESqeSJgyfWl$UF(LW+ iImI!)!9b>=iHQMQouQtwvBl(jj804fEt8d)E&%{G|2P2v diff --git a/lib/Hd_MvCamera_module_GENTL.lib b/lib/Hd_MvCamera_module_GENTL.lib index a65c613a9788aa36e3530d6a5ccb1cad49b8c1da..578b535ee41c6c12f7e6ab81feeae0134eac1aaf 100644 GIT binary patch delta 118 zcmew&@I_$53?`PPzk+^Dp2M`CMV;Yu)8u&OY^Kjmo6j&?F>PO(O?j0nH^$TT$3Gq%(-Ha0c1j7iGOi}A=W ZE&=KU>5j?C%$v;3q{sBRX|grbB>)$3IST*) delta 187 zcmey&+RMh7(#FK_9|#O5aym1KGEVfn#>>gbz+l3_D98W=E|U!z9qTn11X>svd^3}a z@{9A+N)$ALG!=Y2{k$1k8Egd^lFL&VT&!Y}GmDe+9rH6oGh^~gOJb5rGjmd6D$GoD zgHm%+6N^(BQY%s!oULL4g8bcs9P12Yd_A3m{DbR^VvG!ojAESqeSJgyfWl$UF(LW+ iImI!)!9b>=iHQMQouQtwvBl)Oj804fEt3_QE&%{CQaAVj diff --git a/lib/Hd_MvCamera_module_GIGE.lib b/lib/Hd_MvCamera_module_GIGE.lib index b1396b9be8cfc2bad5039077ec72d4077da69fd6..f5ba12df64b2f2e149f3a1b7a1622e6c2dd11692 100644 GIT binary patch delta 108 zcmaDN@I+w4BqkQ4S+m|wp2oC~MV;Yu)8tvK>XYl4otS{k)2vdP?=s6XvY5Ryxjl(> s8ccycM6#SUOQrAa+sTZq@{`lp=D}o@xg3)7a|`q`Q=mrpvx_nU04H}TWB>pF delta 108 zcmaDN@I+w4Bqo*{N6bD?p2oC~MT0@0W%4Xm^~v?jPE0`NX;!JtcbVlGS(crsyEln- s8ccycM6#TfyL!>nx04xJ^$TT$3Gq%(-Ha0c1j7iGOi}A=W ZE&=KU>5j?C%$v-^q{sBRX|fH|B>)@kITQc@ delta 187 zcmeyu+Q-J3(#FK_9|(*laym1KF;4Wm#>>UXz+lS2D98W=E|U!zo$56h1X>svd^3}a z@{9A+N)$ALG!=Y2{k$1k8Egd^lFL&VT&!Y}GmDe+9rH6oGh^~gOJb5rGjmd6D$GoD zgHm%+6N^(BQY%s!oULL4g8bcs9P12Yd_A3m{DbR^VvG!ojAESqeSJgyfWl$UF(LW+ iImI!)!9b>=iHQMQouQtwvBl(jj804fEt8d)E&%{G|2P2v diff --git a/lib/Hd_ResultsSummary_module.lib b/lib/Hd_ResultsSummary_module.lib index a61fbd40216d4091ba157f7b97afab308e79a4fe..ff33633f3db52aec9c9ccb88fc9c624c2109a9d1 100644 GIT binary patch delta 118 zcmew&@I_$53?`Pswa5QWp2M`CMV;Yu)8u&OY^Kjmo6j&?F>?O9FyY}T1_lPE$qSjJ zCu^~m!<48`KEuiZR5tkxv()4dtZ|%fSC*cB2UTe{xtFa4rcxQ9QhIYNyEr2N6TK|m delta 118 zcmew&@I_$53?`PJ|NEa$p2M`CMT0@0WpX@oHj_Zh<}=JzjGU7uUOIM)fq{W(@N^g#37iR$WFG diff --git a/lib/Hd_SocketModule_ModbusTcp.exp b/lib/Hd_SocketModule_ModbusTcp.exp index 49ff857d296ebdebb03f306aa1ab96cffbc73aba..30c37bd291ea123424cd8e8b26775ebc78ae748e 100644 GIT binary patch delta 139 zcmey)eV3avrHzTQM&7B63=C!rjDie6;5pfq$yr&Q;d2uMgKuVX zQGRiLT8V;2kfwr_^E0N;O`E?mGcf@G_CqRL delta 165 zcmcc1{hgaLrHzT59#y1$qG&C_Ws58_vHny1jndupm LK+ERa%uGxGpyx8E diff --git a/lib/Hd_SocketModule_ModbusTcp.lib b/lib/Hd_SocketModule_ModbusTcp.lib index 5ec47732196dc7452962b23c04a9ae6b8cb23ce6..7d987e797c1925944487933e8b6ed09e14a3773c 100644 GIT binary patch delta 108 zcmew+^-XHSI~GpM+Y9dLGcqu6Oy0<0Hd&Xol|`N5bJHXa^~rZxU6?*MO*Z6^+HA|F w%*Z-jM&-ik$!j^}C%3RyKvn5ORFt#4P6>N7c@4(_u=wNxPHmXh?VS6W0bcJXg#Z8m delta 108 zcmew+^-XHSI~LBiA5)I%Gcqu6Oy0<0Hd&Xol|_R=pk)$=`sBN;E=&R~lMOkfHrui( wGqS!kFaLLX@>&l0$t~;^P*wU673D03ub!ToyoTcdSbTB;r#4LMcFz6G0MnZzxBvhE