diff --git a/PreVerify/DefectViewCustom.cpp b/PreVerify/DefectViewCustom.cpp index d8c59ed..8d6c3c3 100644 --- a/PreVerify/DefectViewCustom.cpp +++ b/PreVerify/DefectViewCustom.cpp @@ -15,17 +15,17 @@ #include "qpixmapcache.h" #include "JSONDocUtil.h" #include +#include "PreVerifyWidget.h" DefectViewCustom::DefectViewCustom(QWidget* parent) { - QImageReader::setAllocationLimit(0); setParent(parent); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setTransformationAnchor(QGraphicsView::AnchorUnderMouse); setResizeAnchor(QGraphicsView::AnchorUnderMouse); setRenderHint(QPainter::Antialiasing); - setDragMode(QGraphicsView::RubberBandDrag); + setDragMode(QGraphicsView::ScrollHandDrag); setFrameShape(QFrame::NoFrame); m_scene.setBackgroundBrush(QBrush(QColor(Qt::white))); diff --git a/PreVerify/DefectViewCustom.h b/PreVerify/DefectViewCustom.h index 263e2e2..6c4b45e 100644 --- a/PreVerify/DefectViewCustom.h +++ b/PreVerify/DefectViewCustom.h @@ -9,12 +9,11 @@ #include "logger.h" #include "QPushButton" #include "QLabel" -#include "PreVerifyWidget.h" #include - +class PreVerifyWidget; class DefectViewCustom : public QGraphicsView { Q_OBJECT LOG4QT_DECLARE_QCLASS_LOGGER diff --git a/PreVerify/DefectViewCustom.zip b/PreVerify/DefectViewCustom.zip deleted file mode 100644 index 4c1b953..0000000 Binary files a/PreVerify/DefectViewCustom.zip and /dev/null differ diff --git a/PreVerify/MainWidget.cpp b/PreVerify/MainWidget.cpp index 4cedf56..11c7055 100644 --- a/PreVerify/MainWidget.cpp +++ b/PreVerify/MainWidget.cpp @@ -1,17 +1,24 @@ #include "MainWidget.h" #include "QFont" +#include "qmessagebox.h" MainWidget::MainWidget(QWidget* parent) { + m_sharedMemory.setKey("PreVerify.exe"); + if (m_sharedMemory.attach()) { + QMessageBox::warning(this, "警告", "PreVerify.exe正在运行,请勿重复启动!", QMessageBox::Ok); + exit(-1); + } + else { + m_sharedMemory.create(1); + } + + setUi(); setConnection(); } -MainWidget::~MainWidget() { - delete this; -} - void MainWidget::setUi() { resize(1600, 900); m_centralWgt.setLayout(&m_centralLt); @@ -54,7 +61,7 @@ void MainWidget::setUi() { void MainWidget::setConnection() { QObject::connect(&m_preVerifyBtn, &QPushButton::pressed, this, &MainWidget::slot_preVerifyBtnPressed); QObject::connect(&m_paramSettingBtn, &QPushButton::pressed, this, &MainWidget::slot_paramSettingBtnPressed); - QObject::connect(this, &MainWidget::sig_winStateChangeEvent, &m_preVerifyWgt, &PreVerifyWidget::slot_winStateChangeEvent); + //QObject::connect(this, &MainWidget::sig_winStateChangeEvent, &m_preVerifyWgt, &PreVerifyWidget::slot_winStateChangeEvent); } void MainWidget::load() { diff --git a/PreVerify/MainWidget.h b/PreVerify/MainWidget.h index 439b34e..ee9a40d 100644 --- a/PreVerify/MainWidget.h +++ b/PreVerify/MainWidget.h @@ -8,6 +8,7 @@ #include "PreVerifyWidget.h" #include "qbuttongroup.h" #include "QEvent" +#include "qsharedmemory.h" @@ -16,7 +17,6 @@ class MainWidget : public QMainWindow { public: MainWidget(QWidget* parent = nullptr); - ~MainWidget(); void setUi(); void setConnection(); void load(); @@ -36,6 +36,7 @@ private: PreVerifyWidget m_preVerifyWgt; QWidget m_paramSettingWgt; QButtonGroup m_menuGrp; + QSharedMemory m_sharedMemory; public: void changeEvent(QEvent* event) override; diff --git a/PreVerify/PreVerify.vcxproj b/PreVerify/PreVerify.vcxproj index e009daa..e2ecd7a 100644 --- a/PreVerify/PreVerify.vcxproj +++ b/PreVerify/PreVerify.vcxproj @@ -166,7 +166,7 @@ - + diff --git a/PreVerify/PreVerify.vcxproj.filters b/PreVerify/PreVerify.vcxproj.filters index 6893aff..cbbccc6 100644 --- a/PreVerify/PreVerify.vcxproj.filters +++ b/PreVerify/PreVerify.vcxproj.filters @@ -16,6 +16,9 @@ {7630d594-8c7c-4b8e-b52e-948aa2bbc118} + + {3f54e682-abaa-4fc8-b627-2d43d4b38d7f} + @@ -31,8 +34,12 @@ utils - - + + customComponent + + + customComponent + @@ -44,7 +51,10 @@ utils - + + + customComponent + @@ -54,11 +64,12 @@ main - - - - + + + customComponent + + \ No newline at end of file diff --git a/PreVerify/PreVerifyWidget.cpp b/PreVerify/PreVerifyWidget.cpp index 58a5e90..34e79b3 100644 --- a/PreVerify/PreVerifyWidget.cpp +++ b/PreVerify/PreVerifyWidget.cpp @@ -16,10 +16,13 @@ #include "qpixmapcache.h" #include "QSpacerItem" #include "qmessagebox.h" -#include "resource.h" +#include "QtConcurrent/qtconcurrentrun.h" +#include "QFutureWatcher" +#include "DefectViewCustom.h" PreVerifyWidget::PreVerifyWidget(QWidget* parent) { + QImageReader::setAllocationLimit(0); QPixmapCache::setCacheLimit(8 * 1024 * 1024); setUi(); setConnection(); @@ -29,10 +32,6 @@ PreVerifyWidget::PreVerifyWidget(QWidget* parent) { loadDate(); } -PreVerifyWidget::~PreVerifyWidget() { - delete this; -} - void PreVerifyWidget::setUi() { setLayout(&m_lt); m_lt.addLayout(&m_leftLt, 3); @@ -149,7 +148,10 @@ void PreVerifyWidget::setUi() { m_treeWgt.setIndentation(5); m_treeWgt.setColumnCount(treeHeaders.size()); m_treeWgt.setHeaderLabels(treeHeaders); - m_treeWgt.header()->setSectionResizeMode(QHeaderView::ResizeToContents); + m_treeWgt.setColumnWidth(0, 200); + m_treeWgt.setColumnWidth(1, 45); + m_treeWgt.setColumnWidth(2, 30); + m_treeWgt.setColumnWidth(3, 45); m_treeWgt.setSelectionMode(QAbstractItemView::SingleSelection); } @@ -218,12 +220,12 @@ void PreVerifyWidget::setConnection() { QObject::connect(&m_lastDefectBtn, &QPushButton::pressed, this, &PreVerifyWidget::slot_lastDefectBtnPressed); QObject::connect(&m_nextBoardBtn, &QPushButton::pressed, this, &PreVerifyWidget::slot_nextBoardBtnPressed); QObject::connect(&m_nextDefectBtn, &QPushButton::pressed, this, &PreVerifyWidget::slot_nextDefectBtnPressed); + QObject::connect(this, &PreVerifyWidget::sig_grdLtUpdate, this, &PreVerifyWidget::slot_grdLtUpdate); } void PreVerifyWidget::loadDate() { m_dateCmb.addItem(""); QString path = "D:/PCBDataset/Defect/fengming/AOI_DEFECT"; - QJsonObject yearJson; QDir rootDir(path); QStringList dateList = rootDir.entryList(QDir::NoDotAndDotDot | QDir::AllDirs, QDir::Time); @@ -281,6 +283,7 @@ void PreVerifyWidget::loadTreeWgt() { //创建文件夹Json对象 toJson(yearJson, path); + //创建文件夹树 for (QString yearKey : yearJson.keys()) { QTreeWidgetItem* yearItem = new QTreeWidgetItem(&m_treeWgt); @@ -417,7 +420,35 @@ void PreVerifyWidget::slot_treeWgtCurrentItemChanged(QTreeWidgetItem* current, Q } QJsonArray arr = m_vrsJson.value("Defectx").toArray(); + + QString samplePath = "D:/PCBDataset/Reference/" + jobLayer + "/Learn/panel_image.png"; + if (!QPixmapCache::find(jobLayer, &m_samplePxmp)) { + m_samplePxmp.load(samplePath, nullptr, Qt::NoFormatConversion); + QPixmapCache::insert(jobLayer, m_samplePxmp); + } + + QList defectItems; + collect(count, arr, jobLayer, defectItems); + int sum = 0; + for (DefectViewCustom* item : defectItems) { + m_grdLt.addWidget(item, sum / m_colCount, sum % m_colCount); + sum++; + } + + m_grdScr.verticalScrollBar()->setSingleStep(m_grdScr.height()); + m_grdScr.verticalScrollBar()->setSliderPosition(0); + this->setFocus(); +} + +void PreVerifyWidget::collect(int count, QJsonArray& arr,QString& jobLayer, QList& defectItems) { + QPixmap px; + QPixmapCache::find(jobLayer, &px); for (int i = 0; i < count; i++) { + int defectId = i + 1; + QString scanImgPath = m_dirPath + m_ab + QString::number(defectId) + ".jpg"; + if (!QFile(scanImgPath).exists()) { + continue; + } DefectViewCustom* defectItem = new DefectViewCustom(); defectItem->m_preVerifyWgt = this; defectItem->setParent(this); @@ -426,37 +457,30 @@ void PreVerifyWidget::slot_treeWgtCurrentItemChanged(QTreeWidgetItem* current, Q if (obj.contains("AIresult") && obj.value("AIresult") == 0) { isValid = false; } - int defectId = i + 1; - int defectType = obj.value("Code").toDouble(); + int defectType = obj.value("Code").toInt(); double x = obj.value("X").toDouble(); double y = obj.value("Y").toDouble(); - QString samplePath = "D:/PCBDataset/Reference/" + jobLayer + "\\Learn\\panel_image.png"; - if (!QPixmapCache::find(jobLayer, &m_samplePxmp)) { - m_samplePxmp.load(samplePath, nullptr, Qt::NoFormatConversion); - QPixmapCache::insert(jobLayer, m_samplePxmp); - } bool containSample = m_showCamChk.isChecked(); - defectItem->load(m_dirPath + m_ab + QString::number(defectId) + ".jpg", defectId, isValid, x, y, jobLayer, m_samplePxmp, defectType, m_rowHeight, containSample); - if (m_colCount == 2) { + defectItem->load(scanImgPath, defectId, isValid, x, y, jobLayer, px, defectType, m_rowHeight, containSample); + switch (m_colCount) { + case 2: defectItem->scale(1.8, 1.8); - } - else if (m_colCount == 3) { + break; + case 3: defectItem->scale(1.6, 1.6); - } - else if (m_colCount == 4) { + break; + case 4: defectItem->scale(0.9, 0.9); - } - else if (m_colCount == 5) { + break; + case 5: defectItem->scale(0.9, 0.9); + break; + default: + break; } - m_grdLt.addWidget(defectItem, i / m_colCount, i % m_colCount); - - m_grdScr.verticalScrollBar()->setSingleStep(m_grdScr.height()); + defectItems.push_back(defectItem); } - - m_grdScr.verticalScrollBar()->setSliderPosition(0); - this->setFocus(); } //1.添加 -1.删除 @@ -740,3 +764,7 @@ void PreVerifyWidget::keyPressEvent(QKeyEvent* event) { void PreVerifyWidget::slot_winStateChangeEvent() { slot_treeWgtCurrentItemChanged(m_treeWgt.currentItem(), nullptr); } + +void PreVerifyWidget::slot_grdLtUpdate() { + update(); +} \ No newline at end of file diff --git a/PreVerify/PreVerifyWidget.h b/PreVerify/PreVerifyWidget.h index 86a4198..c4cfcd9 100644 --- a/PreVerify/PreVerifyWidget.h +++ b/PreVerify/PreVerifyWidget.h @@ -16,16 +16,19 @@ #include "qspinbox.h" #include "ScrollAreaCustom.h" #include "qmutex.h" +#include "logger.h" - +class DefectViewCustom; class PreVerifyWidget : public QWidget { + Q_OBJECT + LOG4QT_DECLARE_QCLASS_LOGGER public: PreVerifyWidget(QWidget* parent = nullptr); - ~PreVerifyWidget(); void setUi(); void setConnection(); void load(); + void collect(int count, QJsonArray& arr, QString& jobLayer, QList& defectItems); void updateOne(QString defectId, int action); QString defectId2Desc(int defectId); void filter(); @@ -94,7 +97,8 @@ private: int m_rowHeight = -1; QList m_boardItemList; - +signals: + void sig_grdLtUpdate(); public slots: void slot_treeWgtCurrentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous); @@ -103,6 +107,7 @@ public slots: void slot_nextBoardBtnPressed(); void slot_nextDefectBtnPressed(); void slot_winStateChangeEvent(); + void slot_grdLtUpdate(); }; diff --git a/PreVerify/main.cpp b/PreVerify/main.cpp index 51d30b2..d45345f 100644 --- a/PreVerify/main.cpp +++ b/PreVerify/main.cpp @@ -7,9 +7,9 @@ #include "QGuiApplication" #include #include -#include "XDongleVerifierWorker.h" #include "QDir" #include "QDateTime" +#include "qthreadpool.h" #pragma comment(lib, "Dbghelp.lib") @@ -20,6 +20,8 @@ int main(int argc, char* argv[]) { QApplication a(argc, argv); SetUnhandledExceptionFilter(exceptionCallback); + QThreadPool::globalInstance()->setMaxThreadCount(15); + MainWidget* mainWidget = new MainWidget(); mainWidget->load();