Files
2024-02-27 14:55:21 +08:00

750 lines
19 KiB
C++

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include "titlebar.h"
#include "mywidget.h"
#include "cfgwindow.h"
#include "processtask.h"
#include "hpromptwidget.h"
#include "HMessageBox.h"
#include <QDesktopWidget>
#include <QTextCodec>
#include <QVBoxLayout>
#include <QDebug>
#include <QMutex>
#include <omp.h>
QMutex* r_Mutex = new QMutex();
MainWindow::MainWindow(QWidget* parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setMouseTracking(true);//鼠标追踪
//定时器处理消息
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, [this]() {
r_Mutex->lock();
if (listmsg.size() > 0) {
if (m_left && GetInitState()) {
QString time = listmsg.firstKey();
QString msg = time + listmsg.value(time);
listmsg.remove(time);
if (msg.indexOf("TCP") != -1) {
emit m_left->GetLogMsg(msg, 1);
}
else {
emit m_left->GetLogMsg(msg);
}
}
emit sig_finished(false);
}
else {
emit sig_finished(false);
}
r_Mutex->unlock();
qApp->processEvents();
});
connect(this, &MainWindow::sig_finished, [this](bool isok) {
if (isok) {
m_timer->stop();
}
else {
m_timer->setInterval(10);
m_timer->start();
}
});
}
MainWindow::~MainWindow()
{
emit sig_finished(true);
m_timer->stop();
if (m_timer) {
delete m_timer;
m_timer = NULL;
}
if (m_task)
{
delete m_task;
m_task = nullptr;
}
if (m_title)
{
delete m_title;
m_title = nullptr;
}
if (m_area) {
delete m_area;
m_area = nullptr;
}
if (m_right) {
delete m_right;
m_right = nullptr;
}
if (m_left) {
delete m_left;
m_left = nullptr;
}
my_Para_Process.close();
delete ui;
qDebug() << __FUNCTION__ << "line:" << __LINE__ << " ~MainWindow success!";
}
void MainWindow::initWidget()
{
QDir dir = QApplication::applicationDirPath();
currPath = dir.path();
setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::MSWindowsFixedSizeDialogHint
| Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint);
setStyleSheet("QWidget{background-color: rgb(85, 85, 85);}"
"QToolTip{border-style: none;color:black; font-size:12px;}");
m_jsonObj = loadCameraCfg();
if (m_jsonObj.isEmpty())
{
qCritical() << "[Error] " << " m_jsonObj is null";
//return;
}
int taskFlag;
QHBoxLayout* h_layout = new QHBoxLayout;
QVBoxLayout* m_vBox = new QVBoxLayout;
QWidget* m_widget = new QWidget;
m_task = new ProcessTask;
#pragma omp parallel for
for (int i = 0; i < 2; i++)
{
switch (i)
{
case 0:
m_title = new TitleBar(this);
m_title->setMouseTracking(true);
m_title->setPath(currPath);
m_title->setFixedHeight(38);
m_title->setStyleSheet("Titl eBar{background-color: rgb(85, 85, 85);border:0px;}");
m_title->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
// 加载界面
m_area = new MyWidget(this);
m_area->setParent(this);
m_area->setMouseTracking(true);
m_area->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_area->layoutWindow_setting(bridge.back.json.showWidgets.basicView);
// 日志消息界面
m_left = new LeftWindow(this);
// 配置参数界面
m_right = new RightWidget(this);
m_right->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_right->hide();
h_layout->addWidget(m_left);
h_layout->addWidget(m_area);
h_layout->addWidget(m_right);
h_layout->setStretchFactor(m_left, 1);
h_layout->setStretchFactor(m_area, 5);
h_layout->setStretchFactor(m_right, 1);
h_layout->setContentsMargins(1, 1, 1, 1);
vboxPtr.reset(m_vBox);
m_vBox->setSpacing(0);
m_vBox->addWidget(m_title);
m_vBox->addLayout(h_layout);
m_vBox->setContentsMargins(1, 1, 1, 1);
m_widget->setMouseTracking(true);
delete m_widget->layout();
m_widget->setLayout(m_vBox);
this->setCentralWidget(m_widget);
this->showMaximized();
break;
case 1:
m_task->setJsonObject(m_jsonObj);
m_task->setJsonPath(currPath);
connect(m_task, &ProcessTask::SendStationLabel, [this](int label) {
if (label > 0) {
emit m_left->GetShowGif(label - 1);
}
else {
emit m_left->PausedGif();
}
});
taskFlag = m_task->initTask();
break;
// 加载模块 创建线程
}
}
switch (taskFlag)
{
case ProcessTask::OK:
qDebug() << "[INFO] " << QString::fromUtf8("相机和检测模块加载成功!");
break;
case ProcessTask::ERROR_initAllModule:
{
HPromptWidget* topwindow =
new HPromptWidget(QString::fromUtf8("initAllModule失败!"), this);
topwindow->show();
break;
}
case ProcessTask::ERROR_createModuleThread:
{
HPromptWidget* topwindow =
new HPromptWidget(QString::fromUtf8("createModuleThread失败!"), this);
topwindow->show();
break;
}
case ProcessTask::LOAD_FINS_FAILURE:
{
HPromptWidget* topwindow =
new HPromptWidget(QString::fromUtf8("FINS模块加载失败!"), this);
topwindow->show();
break;
}
case ProcessTask::LOAD_CAMERA_ALGO_FAILURE:
{
HPromptWidget* topwindow =
new HPromptWidget(QString::fromUtf8("相机或算法模块加载失败!"), this);
topwindow->show();
break;
}
case ProcessTask::INIT_FINS_FAILURE:
{
HPromptWidget* topwindow =
new HPromptWidget(QString::fromUtf8("FINS初始化数据有误,或服务器连接失败!"), this);
topwindow->show();
break;
}
case ProcessTask::INIT_CAMERA_ALGO_FAILURE:
{
HPromptWidget* topwindow =
new HPromptWidget(QString::fromUtf8("相机模块初始化失败!"), this);
topwindow->show();
break;
}
case ProcessTask::THREAD_CAMERA_FAILURE:
{
HPromptWidget* topwindow =
new HPromptWidget(QString::fromUtf8("相机线程加载失败!"), this);
topwindow->show();
break;
}
default:
break;
}
m_task->startTask();
if (!Isinit)
Isinit = true;
signalAndSlot();
}
void MainWindow::signalAndSlot()
{
//加载 外部exe
connect(m_title, &TitleBar::mouseRecover, this, [=]()
{
setCursor(Qt::ArrowCursor);
});
connect(m_title, &TitleBar::OpenProjectSignal, this, [=](QString path)
{
m_right->Load_Param_Config(path);
setCursor(Qt::ArrowCursor);
});
connect(m_title, &TitleBar::SaveProjectSignal, this, [=](QString path)
{
m_right->Save_Param_Config(path);
setCursor(Qt::ArrowCursor);
});
connect(m_title, &TitleBar::showStatisticalTableSignal, this, [=]()
{
if (my_Para_Process.state() == QProcess::ProcessState::NotRunning) {
my_Para_Process.start("./parm.exe");
if (my_Para_Process.waitForStarted(15))
{
qDebug() << "[INFO] " << tr("图像参数配置界面启动成功!");
//等待外部程序结束,如果在给定的时间内关闭外部程序,返回为真,超时返回false
}
else {
qDebug() << "[Error] " << tr("图像参数配置界面启动失败!");
};
}
setCursor(Qt::ArrowCursor);
});
connect(m_area, &MyWidget::mouseRecover, this, [=]()
{
setCursor(Qt::ArrowCursor);
});
connect(m_right, &RightWidget::sendBtnSignal, this, &MainWindow::On_sendCommond);
connect(this, SIGNAL(sendImage(QString, QImage*, int)), m_area, SLOT(On_reciveImage(QString, QImage*, int))); // 传递图片
connect(&bridge.front, &frontEnd::showImgSingal, m_area, &MyWidget::On_reciveImage); // 传递图片
//connect(bridge, SIGNAL(showImgSingal(QString, QImage*, int)), m_area, SLOT(On_reciveImage(QString, QImage*, int)));
connect(m_task, SIGNAL(sendImage(QString, QImage*, int)), m_area, SLOT(On_reciveImage(QString, QImage*, int))); // 传递图片
connect(m_task, SIGNAL(sendData(QString, QByteArray)), m_area, SLOT(On_reciveData(QString, QByteArray))); // 传递数据
}
void MainWindow::SendImage(cv::Mat& mtx, QString outstr, QString outstrRes) {
QStringList ap = outstr.split("_");
if (ap.size() < 3)return;
QString name = "2D";
cv::Mat rgb;
QImage* itemImage = nullptr;
if (mtx.type() == CV_8UC1)
{
mtx.copyTo(rgb);
itemImage = new QImage(QSize(rgb.cols, rgb.rows), QImage::Format_Grayscale8);
QImage qim((const unsigned char*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_Grayscale8);
*itemImage = qim.copy();
}
else if (mtx.type() == CV_16U) // 双通道转单通道显示
{
cv::normalize(mtx, mtx, 0, 255, cv::NORM_MINMAX);
cv::convertScaleAbs(mtx, rgb);
itemImage = new QImage(QSize(rgb.cols, rgb.rows), QImage::Format_Grayscale8);
QImage qim((const unsigned char*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_Grayscale8);
*itemImage = qim.copy();
}
else if (mtx.type() == CV_8UC3)
{
cv::cvtColor(mtx, rgb, cv::COLOR_BGR2RGB);
itemImage = new QImage(QSize(rgb.cols, rgb.rows), QImage::Format_RGB888);
QImage qim((const unsigned char*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888);
*itemImage = qim.copy();
}
else if (mtx.type() == CV_8UC4)
{
cv::cvtColor(mtx, rgb, cv::COLOR_BGRA2RGBA);
itemImage = new QImage(QSize(rgb.cols, rgb.rows), QImage::Format_ARGB32);
QImage qim((const unsigned char*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_ARGB32);
*itemImage = qim.copy();
}
if (m_area)
emit sendImage(name, itemImage, 0);
}
void MainWindow::SendImage2(cv::Mat& mtx, QString outstr, QString outstrRes) {
QStringList ap = outstr.split("_");
if (ap.size() < 3)return;
QString name = "3D";
cv::Mat rgb;
QImage* itemImage = nullptr;
if (mtx.type() == CV_8UC1)
{
mtx.copyTo(rgb);
itemImage = new QImage(QSize(rgb.cols, rgb.rows), QImage::Format_Grayscale8);
QImage qim((const unsigned char*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_Grayscale8);
*itemImage = qim.copy();
}
else if (mtx.type() == CV_16U) // 双通道转单通道显示
{
cv::normalize(mtx, mtx, 0, 255, cv::NORM_MINMAX);
cv::convertScaleAbs(mtx, rgb);
itemImage = new QImage(QSize(rgb.cols, rgb.rows), QImage::Format_Grayscale8);
QImage qim((const unsigned char*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_Grayscale8);
*itemImage = qim.copy();
}
else if (mtx.type() == CV_8UC3)
{
cv::cvtColor(mtx, rgb, cv::COLOR_BGR2RGB);
itemImage = new QImage(QSize(rgb.cols, rgb.rows), QImage::Format_RGB888);
QImage qim((const unsigned char*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888);
*itemImage = qim.copy();
}
else if (mtx.type() == CV_8UC4)
{
cv::cvtColor(mtx, rgb, cv::COLOR_BGRA2RGBA);
itemImage = new QImage(QSize(rgb.cols, rgb.rows), QImage::Format_ARGB32);
QImage qim((const unsigned char*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_ARGB32);
*itemImage = qim.copy();
}
if (m_area)
emit sendImage(name, itemImage, 0);
}
void MainWindow::mousePressEvent(QMouseEvent* event)
{
if (Qt::LeftButton == event->button() && m_bCanDragResize)
{
m_start_drag_point = event->globalPos();
}
return QWidget::mousePressEvent(event);
}
void MainWindow::mouseMoveEvent(QMouseEvent* event)
{
if (Qt::LeftButton & event->buttons())
{
if (m_bCanDragResize)
{
if (m_emHorizontal == DRAG_LOCK_RIGHT && m_emVertical == DRAG_LOCK_TOP)
{
QPoint gloPoint = event->globalPos();
QRect rect = this->rect();
QPoint tl = mapToGlobal(rect.topLeft());
QPoint rb = mapToGlobal(rect.bottomRight());
QRect rMove(tl, rb);
if (rb.x() - gloPoint.x() <= minimumWidth())
rMove.setX(tl.x());
else
rMove.setX(gloPoint.x());
if (rb.y() - gloPoint.y() <= minimumHeight())
{
rMove.setY(tl.y());
rMove.setHeight(gloPoint.y() - tl.y());
}
else
rMove.setY(gloPoint.y());
setGeometry(rMove);
}
else if (m_emHorizontal == DRAG_LOCK_RIGHT && m_emVertical == DRAG_LOCK_BOTTOM)
{
QPoint gloPoint = event->globalPos();
QRect rect = this->rect();
QPoint tl = mapToGlobal(rect.topLeft());
QPoint rb = mapToGlobal(rect.bottomRight());
QRect rMove(tl, rb);
if (rb.x() - gloPoint.x() <= minimumWidth())
rMove.setX(tl.x());
else
rMove.setX(gloPoint.x());
if (rb.y() - gloPoint.y() <= minimumHeight())
{
rMove.setY(tl.y());
rMove.setHeight(gloPoint.y() - tl.y());
}
else
rMove.setY(gloPoint.y());
setGeometry(rMove);
}
else if (m_emHorizontal == DRAG_LOCK_LEFT && m_emVertical == DRAG_LOCK_BOTTOM)
{
QPoint gloPoint = event->globalPos();
QRect rect = this->rect();
QPoint tl = mapToGlobal(rect.topLeft());
QPoint rb = mapToGlobal(rect.bottomRight());
QRect rMove(tl, rb);
if (rb.x() - gloPoint.x() <= minimumWidth())
{
rMove.setX(tl.x());
rMove.setWidth(gloPoint.x() - tl.x());
}
else
rMove.setX(gloPoint.x());
if (rb.y() - gloPoint.y() <= minimumHeight())
{
rMove.setY(tl.y());
rMove.setHeight(gloPoint.y() - tl.y());
}
else
rMove.setY(gloPoint.y());
setGeometry(rMove);
}
else if (m_emHorizontal == DRAG_LOCK_RIGHT)
{
QPoint gloPoint = event->globalPos();
QRect rect = this->rect();
QPoint tl = mapToGlobal(rect.topLeft());
QPoint rb = mapToGlobal(rect.bottomRight());
QRect rMove(tl, rb);
if (rb.x() - gloPoint.x() <= minimumWidth())
rMove.setX(tl.x());
else
rMove.setX(gloPoint.x());
this->setGeometry(rMove);
}
else if (m_emVertical == DRAG_LOCK_BOTTOM)
{
QPoint gloPoint = event->globalPos();
QRect rect = this->rect();
QPoint tl = mapToGlobal(rect.topLeft());
QPoint rb = mapToGlobal(rect.bottomRight());
QRect rMove(tl, rb);
if (rb.y() - gloPoint.y() <= minimumHeight())
rMove.setY(tl.y());
else
rMove.setY(gloPoint.y());
this->setGeometry(rMove);
}
else if (m_emVertical == DRAG_LOCK_TOP && m_emHorizontal != DRAG_LOCK_LEFT)
{
QPoint gloPoint = event->globalPos();
QRect rect = this->rect();
QPoint tl = mapToGlobal(rect.topLeft());
QPoint rb = mapToGlobal(rect.bottomRight());
QRect rMove(tl, rb);
qreal y_val = rb.y() - gloPoint.y();
if (y_val <= minimumHeight())
{
rMove.setY(tl.y());
rMove.setHeight(gloPoint.y() - tl.y());
}
else
rMove.setY(gloPoint.y());
qreal screen_h = qApp->desktop()->screenGeometry(this).height();
if (rMove.height() + rMove.y() > screen_h - 60)
{
rMove.setHeight(rMove.height() - 30);
}
this->setGeometry(rMove);
}
else
{
const QPoint point_offset = event->globalPos() - m_start_drag_point;
m_start_drag_point = event->globalPos();
int nOffsetX1 = DRAG_LOCK_RIGHT == m_emHorizontal ? point_offset.x() : 0;
int nOffsetY1 = DRAG_LOCK_BOTTOM == m_emVertical ? point_offset.y() : 0;
int nOffsetX2 = DRAG_LOCK_LEFT == m_emHorizontal ? point_offset.x() : 0;
int nOffsetY2 = DRAG_LOCK_TOP == m_emVertical ? point_offset.y() : 0;
setGeometry(geometry().adjusted(nOffsetX1, nOffsetY1, nOffsetX2, nOffsetY2));
}
}
}
else if (Qt::NoButton == event->button())
{
const QPoint& globalPos = event->globalPos();
const QPoint& pos = event->pos();
bool bHorLeft = qAbs(globalPos.x() - this->geometry().x()) < g_nBorder;
bool bHorRight = (pos.x() > this->rect().right() - g_nBorder);
bool bVertTop = pos.y() < g_nBorder - 2;
bool bVertBottom = pos.y() > this->rect().bottom() - g_nBorder;
if (bHorLeft || bHorRight || bVertTop || bVertBottom)
{
m_bCanDragResize = true;
if (bHorLeft && bVertTop) //左上角拖拽
{
setCursor(Qt::SizeFDiagCursor);
m_emHorizontal = DRAG_LOCK_RIGHT;
m_emVertical = DRAG_LOCK_BOTTOM;
}
else if (bHorLeft && bVertBottom) //左下角拖拽
{
setCursor(Qt::SizeBDiagCursor);
m_emHorizontal = DRAG_LOCK_RIGHT;
m_emVertical = DRAG_LOCK_TOP;
}
else if (bHorRight && bVertTop) //右上角拖拽
{
setCursor(Qt::SizeBDiagCursor);
m_emHorizontal = DRAG_LOCK_LEFT;
m_emVertical = DRAG_LOCK_BOTTOM;
}
else if (bHorRight && bVertBottom) //右下角拖拽
{
setCursor(Qt::SizeFDiagCursor);
m_emHorizontal = DRAG_LOCK_LEFT;
m_emVertical = DRAG_LOCK_TOP;
}
else if (bHorLeft) //左边框拖拽
{
setCursor(Qt::SizeHorCursor);
m_emHorizontal = DRAG_LOCK_RIGHT;
m_emVertical = DRAG_KEEP;
}
else if (bHorRight) //右边框拖拽
{
setCursor(Qt::SizeHorCursor);
m_emHorizontal = DRAG_LOCK_LEFT;
m_emVertical = DRAG_KEEP;
}
else if (bVertTop) //上边框拖拽
{
setCursor(Qt::SizeVerCursor);
m_emHorizontal = DRAG_KEEP;
m_emVertical = DRAG_LOCK_BOTTOM;
}
else if (bVertBottom) //下边框拖拽
{
setCursor(Qt::SizeVerCursor);
m_emHorizontal = DRAG_KEEP;
m_emVertical = DRAG_LOCK_TOP;
}
}
else if (m_bCanDragResize)
{
m_bCanDragResize = false;
setCursor(Qt::ArrowCursor);
}
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent* event)
{
return QWidget::mouseReleaseEvent(event);
}
void MainWindow::resizeEvent(QResizeEvent* event)
{
Q_UNUSED(event);
// ui->View->fitInView(retPixmap,Qt::KeepAspectRatio);
}
void MainWindow::On_sendCommond(int type)
{
switch (type) {
//case 1:
//{
// //界面切换
// if (m_area->GetMyWidgetType() == MyWidgetType::RESULT) {
// m_area->layoutWindow(m_jsonObj, MyWidgetType::CAMERA);
// }
// else
// {
// m_area->layoutWindow(m_jsonObj, MyWidgetType::RESULT);
// }
//
// break;
//}
case 1:
{
//界面切换
if (m_area->GetMyWidgetType() == MyWidgetType::RESULT) {
m_area->layoutWindow_setting("Camera");
}
else
{
m_area->layoutWindow_setting("Algorithm");
}
break;
}
case 2:
{
//m_task->startTask();
//
////m_left->GetShowGif(0);
//if(!Isinit)
// Isinit = true;
////test();
break;
}
case 3: {
// m_left->GetShowGif(1);
//m_left->PausedGif();
break;
}
case 4:
{
int result = HMessageBox::showMyMessageBox(NULL, QString::fromUtf8("请问是否清空数据?"), 1, true);
if (result == 0)
{
m_task->clearData();
}
break;
}
}
}
bool MainWindow::GetInitState() {
return Isinit;
}
void MainWindow::getMsg(std::string time, std::string msg) {
QString q_msg = QString::fromStdString(msg);
QString q_time = QString::fromStdString(time);
r_Mutex->lock();
listmsg.insert(q_time, q_msg);
r_Mutex->unlock();
}
void MainWindow::disconnectMV(QString msg)
{
HPromptWidget* topwindow = new HPromptWidget(QString::fromUtf8("相机断开连接!") + msg, this);
topwindow->show();
}
QJsonObject MainWindow::loadCameraCfg()
{
QJsonObject json_object;
try
{
QJsonParseError jsonError;
QString json_cfg = currPath + "/config/camera_cfg.json";
if (json_cfg.isEmpty())
{
qCritical() << "[Error] " << " JsonPath is null!";
return json_object;
}
QFile JsonFile;
JsonFile.setFileName(json_cfg);
JsonFile.open(QIODevice::ReadOnly);
QByteArray m_Byte = JsonFile.readAll();
if (m_Byte.isEmpty())
{
qDebug() << "[Error] " << json_cfg + " Content is empty";
JsonFile.close();
return json_object;
}
QJsonDocument jsonDocument(QJsonDocument::fromJson(m_Byte, &jsonError));
if (!jsonDocument.isNull() && jsonError.error == QJsonParseError::NoError)
{
if (jsonDocument.isObject())
{
json_object = jsonDocument.object();
return json_object;
}
}
else
{
qCritical() << "[Error] " << json_cfg + " is error!";
}
JsonFile.close();
}
catch (QString ev)
{
qCritical() << "[Error] " << " ev:" << ev;
}
return json_object;
}