登录,加载,主要界面的切换已完工。添加handleAi管理类。sql可视化占坑。

This commit is contained in:
2024-05-23 16:43:27 +08:00
parent 38f8a56275
commit 5dd05c9bda
13 changed files with 431 additions and 41 deletions
+9 -1
View File
@@ -41,6 +41,8 @@ endforeach()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp")
FILE(GLOB HANDLEAI_HEAD_FILES "./handleAi/*.h" )
FILE(GLOB HANDLEAI_SRC_FILES "./handleAi/*.cpp")
FILE(GLOB UIMODULE_HEAD_FILES "./uiModule/*.h" )
FILE(GLOB UIMODULE_SRC_FILES "./uiModule/*.cpp")
FILE(GLOB BACK_HEAD_FILES "./back/*.h" )
@@ -73,6 +75,8 @@ if(ANDROID)
${TCP_SRC_FILES}
${UIMODULE_HEAD_FILES}
${UIMODULE_SRC_FILES}
${HANDLEAI_HEAD_FILES}
${HANDLEAI_SRC_FILES}
${UI_FILES}
)
else()
@@ -90,7 +94,9 @@ else()
${TCP_SRC_FILES}
${UIMODULE_HEAD_FILES}
${UIMODULE_SRC_FILES}
${UI_FILES} "back/handleAiModel.h" "ff.rc" "back/fileManager.h""icon.qrc" )
${HANDLEAI_HEAD_FILES}
${HANDLEAI_SRC_FILES}
${UI_FILES} "ff.rc" "icon.qrc" )
else()
add_executable( ${CURRENT_FOLDER} WIN32
${HEAD_FILES}
@@ -105,6 +111,8 @@ else()
${TCP_SRC_FILES}
${UIMODULE_HEAD_FILES}
${UIMODULE_SRC_FILES}
${HANDLEAI_HEAD_FILES}
${HANDLEAI_SRC_FILES}
${UI_FILES})
endif()
@@ -290,10 +290,6 @@ void algoThread::getAllFiles(string path, vector<string>& files, string format)
}
}
inline string getFileName(string path)
{
return path.substr(path.find_last_of("\\") + 1, path.find_last_of(".") - path.find_last_of("\\") - 1);
}
void drawContoursOverlap(cv::Mat& image, const std::vector<std::vector<cv::Point>>& contours) {
cv::Mat mask = cv::Mat::zeros(image.size(), CV_8U);
@@ -716,7 +716,7 @@ public:
{
this->terminate();
}
handleAiModel* modelPtr;
//handleAiModel* modelPtr;
sqlManager* sql;
threadManager* tManager;
sncodeCls* snDatas;
@@ -736,7 +736,7 @@ public:
void getAllFiles(std::string path, std::vector<std::string>& files, std::string format);
void Init(threadManager* threadManager) {
tManager = threadManager;
modelPtr = &threadManager->models;
//modelPtr = &threadManager->models;
sql = threadManager->sql;
snDatas = &threadManager->snDatas;
}
@@ -2,6 +2,7 @@
#include <triggerManager.h>
#include <cameraManager.h>
#include <jsonParsing.h>
#include <handleAi/handleAiModel.h>
#include <future>
backEndManager::backEndManager()
{
@@ -11,6 +12,7 @@ backEndManager::backEndManager()
_triggerManager = new triggerManager();
_cameraManager = new cameraManager();
_threadManager = new threadManager();
_handleAiModelManager = new handleAiModelManager();
}
void backEndManager::run()
{
@@ -31,6 +33,7 @@ void backEndManager::run()
std::vector<std::future<void>> futures;//Òì²½³õʼ»¯
futures.push_back(std::async(std::launch::async, &triggerManager::init, _triggerManager, this));
futures.push_back(std::async(std::launch::async, &cameraManager::init, _cameraManager, this));
futures.push_back(std::async(std::launch::async, &handleAiModelManager::init, _handleAiModelManager,this));
for (auto& future : futures) {
future.wait();
}
@@ -4,6 +4,7 @@
#include <globalStruct.h>
#include <qmutex.h>
#include <qthread.h>
class handleAiModelManager;
class triggerManager;
class cameraManager;
class jsonConfiguration;
@@ -22,6 +23,7 @@ public:
triggerManager* _triggerManager = nullptr;//触发器
cameraManager* _cameraManager = nullptr;//
threadManager* _threadManager = nullptr;
handleAiModelManager* _handleAiModelManager;
backEndManager();
~backEndManager();
@@ -1,20 +0,0 @@
#pragma once
#include <handleai.h>
#include <io.h>
/// <summary>
/// 模型
/// </summary>
class handleAiModel
{
public:
////////模型放这里///////
////////模型初始化放这里///////
handleAiModel()
{
system("cls");
}
~handleAiModel()
{
}
};
@@ -7,7 +7,7 @@
#include <filesystem>
#include <opencv.hpp>
#include <string>
#include <handleAiModel.h>
#include <handleAi/handleAiModel.h>
#include <sqliteManager/sqlManager.h>
#include <QtConcurrent/qtconcurrent>
#include <QMetaType>
@@ -230,7 +230,7 @@ public:
QMutex queueMutex;
QQueue<std::shared_ptr <detData>> detDataQueue;
sqlManager* sql;
handleAiModel models;//初始化模型
//handleAiModel models;//初始化模型
autoDelete* autoDeleteThread;
QMutex insertQueueMutex;
@@ -0,0 +1,226 @@
#include "sqliteReader.h"
#include <qlabel.h>
#include <qcombobox.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qstandarditemmodel.h>
sqliteReader::sqliteReader(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
readIniFile(".//config//sqliteReader.ini");
sqlManager.initPara();
std::vector<std::string> res=sqlManager.GetTables();
widgetInit(res);
}
sqliteReader::~sqliteReader()
{
sqlManager.uninitlize();
}
void sqliteReader::widgetInit(std::vector<std::string>tables)
{
//1
layout1 = new QVBoxLayout();
ui.centralWidget->setLayout(layout1);
//1-1
QWidget* vLayout2Widget = new QWidget();
QHBoxLayout * vLayoutt2 = new QHBoxLayout();
vLayout2Widget->setLayout(vLayoutt2);
layout1->addWidget(vLayout2Widget);
//1-1-1
QLabel* vLayout2Label = new QLabel(u8"请选择日期");
vLayoutt2->addWidget(vLayout2Label);
QComboBox * Layou2MBox = new QComboBox();
for (auto &data : tables)
{
Layou2MBox->addItem(QString::fromStdString(data));
}
vLayoutt2->addWidget(Layou2MBox);
connect(Layou2MBox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [=]() {switchWidget(Layou2MBox->currentText().toStdString()); });
QLabel* vLayout2Label2 = new QLabel(u8"根据SN查询");
vLayoutt2->addWidget(vLayout2Label2);
QLineEdit *Layout2LEdit = new QLineEdit();
vLayoutt2->addWidget(Layout2LEdit);
QPushButton* layout2QPBtn = new QPushButton(u8"查询");
vLayoutt2->addWidget(layout2QPBtn);
connect(layout2QPBtn,& QPushButton::clicked, this, [=]() {searchSN(Layou2MBox->currentText().toStdString(), Layout2LEdit->text().toStdString()); });
//1-2
tableWidget = new QTableWidget();
layout1->addWidget(tableWidget);
switchWidget(Layou2MBox->currentText().toStdString());
}
void sqliteReader::switchWidget(std::string tableName)
{
std::vector<sqlDataStruct> res = sqlManager.getAllData(tableName);
tableWidget->clear();
delete tableWidget;
tableWidget = new QTableWidget();
layout1->addWidget(tableWidget);
if (res.size() > 0)
{
int colsNum = res.at(0).dataVec.size() + 1 - avoidMap.size();
tableWidget->setColumnCount(colsNum);
tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("SN"));
//for (int i = 0; i < res.at(0).dataVec.size(); i++)
{
int index = 1;
std::unordered_map<QString, QString>::iterator it;
std::unordered_map<QString, QString>::iterator it2;
for (auto&data : res.at(0).dataVec)
{
it = avoidMap.find(QString::fromStdString(data.dataName));
if (it == avoidMap.end())
{
QString Name = QString::fromStdString(data.dataName);
it2 = cuttomName.find(Name);
if (it2 != cuttomName.end())
Name = it2->second;
tableWidget->setHorizontalHeaderItem(index, new QTableWidgetItem(Name));
index++;
}
}
}
//tableWidget->setColumnCount(res.size());
for (int i = 0; i < res.size(); i++)
{
int row = tableWidget->rowCount();
tableWidget->insertRow(row);
tableWidget->setItem(row, 0, new QTableWidgetItem(QString::fromStdString(res[i].SN)));
{
int index = 1;
std::unordered_map<QString, QString>::iterator it;
for (auto&data : res.at(i).dataVec)
{
it = avoidMap.find(QString::fromStdString(data.dataName));
if (it == avoidMap.end())
{
tableWidget->setItem(row, index, new QTableWidgetItem(QString::fromStdString(data.valueText)));
index ++;
}
}
}
}
}
//tableWidget->horizontalHeader
}
void sqliteReader::searchSN(std::string tableName, std::string SN)
{
sqlDataStruct res = sqlManager.selectData(SN,tableName);
tableWidget->clear();
delete tableWidget;
tableWidget = new QTableWidget();
layout1->addWidget(tableWidget);
if (res.SN.compare(""))//非空
{
tableWidget->setColumnCount(res.dataVec.size() - avoidMap.size());
//tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("SN"));
{
int index = 0;
std::unordered_map<QString, QString>::iterator it;
std::unordered_map<QString, QString>::iterator it2;
for (auto&data : res.dataVec)
{
it = avoidMap.find(QString::fromStdString(data.dataName));
if (it == avoidMap.end())
{
QString Name = QString::fromStdString(data.dataName);
it2 = cuttomName.find(Name);
if (it2 != cuttomName.end())
Name = it2->second;
tableWidget->setHorizontalHeaderItem(index, new QTableWidgetItem());
index++;
}
}
}
//tableWidget->setColumnCount(res.dataVec.size());
int row = tableWidget->rowCount();
tableWidget->insertRow(row);
{
int index = 0;
std::unordered_map<QString, QString>::iterator it;
for (auto&data : res.dataVec)
{
it = avoidMap.find(QString::fromStdString(data.dataName));
if (it == avoidMap.end())
{
tableWidget->setItem(row, index, new QTableWidgetItem(QString::fromStdString(data.valueText)));
index++;
}
}
}
}
else
{
tableWidget->setColumnCount(res.dataVec.size() + 1);
tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("SN"));
tableWidget->setColumnCount(1);
int row = tableWidget->rowCount();
tableWidget->insertRow(row);
tableWidget->setItem(row, 0, new QTableWidgetItem(u8"找不到该数据!"));
}
//tableWidget->horizontalHeader
}
bool sqliteReader::readIniFile(const QString &filePath) {
//std::unordered_map<QString, QString> avoiData;
//std::unordered_map<QString, QString> cutomName;
QFile file(filePath);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file);
QString currentSection;
while (!in.atEnd()) {
QString line = in.readLine().trimmed();
if (line.startsWith('[') && line.endsWith(']')) {
// This line is a section header
currentSection = line.mid(1, line.length() - 2);
}
else if (!line.isEmpty() && !line.startsWith(';') && !currentSection.isEmpty()) {
// This line is a key-value pair within a section
int separatorIndex = line.indexOf('=');
if (separatorIndex != -1) {
if (!currentSection.compare("avoid"))
{
QString key = line.left(separatorIndex).trimmed();
QString value = line.mid(separatorIndex + 1).trimmed();
if (!value.compare("true"))
avoidMap.insert({ key, value });
}
else if (!currentSection.compare("customName"))
{
QString key = line.left(separatorIndex).trimmed();
QString value = line.mid(separatorIndex + 1).trimmed().toUtf8();
cuttomName.insert({ key, value });
}
}
}
}
file.close();
}
else
{
file.close();
return false;
}
return true;
}
@@ -0,0 +1,27 @@
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_sqliteReader.h"
#include "sqlControler.h"
#include <qtablewidget.h>
#include <qlayout.h>
#include <unordered_map>
class sqliteReader : public QMainWindow
{
Q_OBJECT
public:
sqliteReader(QWidget *parent = nullptr);
~sqliteReader();
QVBoxLayout * layout1;
QTableWidget* tableWidget;
sqlManager sqlManager;
std::unordered_map<QString, QString>avoidMap;//不显示该数据
std::unordered_map<QString, QString>cuttomName;//自定义列名
void widgetInit(std::vector<std::string>tables);
void switchWidget(std::string tableNam);
void searchSN(std::string tableNam,std::string SN);
bool readIniFile(const QString &filePath);
private:
Ui::sqliteReaderClass ui;
};
+4
View File
@@ -93,5 +93,9 @@ 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)
#pragma once
@@ -0,0 +1,123 @@
#include <handleai.h>
#include <io.h>
#include <mutex>
#include <future>
#include <qobject.h>
#include <backEndManager.h>
class handleAiModelBase
{
public:
std::string path;
int gpuIndex =0;
std::mutex* gpuMutex;
virtual void init() {};
virtual bool destroy() { return true; };
virtual cv::Mat evalute() { return cv::Mat(); };
};
class handleAiModelSeg :public handleAiModelBase
{
public:
handleAiModelSeg(std::string pathIn, int gpuIndexIn)
{
path = pathIn;
gpuIndex = gpuIndexIn;
};
void init() override
{
segPtr = handdleAI::CreateSegObj((char*)path.c_str(),gpuIndex);
}
bool destroy() override
{
if (segPtr == nullptr)
return false;
handdleAI::DestroySegObj(segPtr);
return true;
}
private:
handdleAI::pSegmentation* segPtr = nullptr;
};
class handleAiModelCls :public handleAiModelBase
{
public:
handleAiModelCls(std::string pathIn, int gpuIndexIn)
{
path = pathIn;
gpuIndex = gpuIndexIn;
};
void init() override
{
clsPtr = handdleAI::CreateClsObjVT((char*)path.c_str(), gpuIndex);
}
bool destroy() override
{
if (clsPtr == nullptr)
return false;
handdleAI::DestroyClsObj(clsPtr);
return true;
}
private:
handdleAI::pClassification* clsPtr;
};
class handleAiModelManager :public QObject
{
public:
handleAiModelSeg* largeSeg;
handleAiModelCls* largeCls;
handleAiModelSeg* midSeg;
handleAiModelCls* midCls;
handleAiModelSeg* smallSeg;
handleAiModelCls* smallCls;
////////模型放这里///////
handleAiModelManager()
{
gpuMutex = std::vector<std::mutex*>(gpuCnt, new std::mutex);
largeSeg = new handleAiModelSeg("./HandleAiModels/large-seg.BHD",0);
midSeg = new handleAiModelSeg("./HandleAiModels/mid-seg.BHD", 0);
smallSeg = new handleAiModelSeg("./HandleAiModels/small-seg.BHD", 0);
largeCls = new handleAiModelCls("./HandleAiModels/large-cls.BHD", 0);
midCls = new handleAiModelCls("./HandleAiModels/mid-cls.BHD", 0);
smallCls = new handleAiModelCls("./HandleAiModels/small_cls.BHD", 0);
models.push_back(largeSeg);
models.push_back(midSeg);
models.push_back(smallSeg);
models.push_back(largeCls);
models.push_back(midCls);
models.push_back(smallCls);
}
///////////END/////////
void init(backEndManager* _backEndManagerIn)
{
return;
std::vector<std::future<void>> futures;//异步初始化
for(auto model: models)
{
futures.push_back(std::async(std::launch::async, &handleAiModelBase::init, model));
emit _backEndManagerIn->sendInitString(QString::fromStdString(getFileName(model->path) + "初始化中..."));
}
int cnt = 0;
for (auto& func : futures)
{
func.wait();
emit _backEndManagerIn->sendInitString(QString::fromStdString(getFileName(models[cnt]->path) + "成功"));
cnt++;
}
}
~handleAiModelManager()
{
for (auto model : models)
model->destroy();
}
private:
std::vector<handleAiModelBase*> models;
std::vector<std::mutex*>gpuMutex;
int gpuCnt = 1;//gpu数量
};
#pragma once
+9
View File
@@ -221,6 +221,15 @@ void MainWindow::leftBarInit()
pageWidgets.addWidget(_logWidget);
pageBtns.push_back(logBtn);
toolBarButton* sqlBtn = new toolBarButton(
defaultWidth,
defaultHeight,
QIcon(":/topBar/icon/sql.png"),
u8"SQL可视化");
//_logWidget = new logWidget();
//pageWidgets.addWidget(_logWidget);
pageBtns.push_back(sqlBtn);
for (int index = 0; index < pageBtns.size(); index++)
{
layout->addWidget(pageBtns[index]);
+24 -12
View File
@@ -58,6 +58,7 @@ private:
QWidget* mainWidget;
QWidget* mainWidget2;
bool isLogin = false;
bool backEndInit = false;
bool isMoving = false;
QPoint startPos;
@@ -91,26 +92,36 @@ public slots:
{
if (input == true)
{
/*blurEffectAnimation->setStartValue(0);
blurEffectAnimation->setEndValue(20);
blurEffectAnimation->start();
_loadingWidget.setStatus(&stackedWidgets);
stackedWidgets.setCurrentIndex(1);
blurEffectAnimation->setStartValue(20);
blurEffectAnimation->setEndValue(0);
blurEffectAnimation->start();*/
loading(true);
if (backEndInit == true)
{
blurEffectAnimation->setStartValue(0);
blurEffectAnimation->setEndValue(20);
blurEffectAnimation->start();
stackedWidgets.setCurrentIndex(2);
blurEffectAnimation->setStartValue(20);
blurEffectAnimation->setEndValue(0);
blurEffectAnimation->start();
}
else
{
isLogin = true;
loading(true);
}
}
else if (input == false)
{
stackedWidgets.setCurrentIndex(0);
loading(false);
}
else if(input == false)stackedWidgets.setCurrentIndex(0);
}
void loading(bool input)
{
if (input == true)
{
blurEffectAnimation->setStartValue(0);
blurEffectAnimation->setEndValue(20);
blurEffectAnimation->start();
//_loadingWidget.start();
stackedWidgets.setCurrentIndex(1);
blurEffectAnimation->setStartValue(0);
blurEffectAnimation->setEndValue(0);
@@ -141,7 +152,8 @@ public slots:
{
case initStatus::InitOK:
backEndInit = true;
loading(false);
if (isLogin == true)
loading(false);
break;
default:
_loadingWidget.setError();