262 lines
7.7 KiB
C++
Raw Normal View History

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QImage>
#include <QStringList>
#include <QDebug>
#include <QVBoxLayout>
#include <QMessageBox>
#include <QStatusBar>
#include "VrLog.h"
2025-08-31 21:08:28 +08:00
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonObject>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 设置窗口图标
this->setWindowIcon(QIcon(":/resource/logo.png"));
// 隐藏标题栏
setWindowFlags(Qt::FramelessWindowHint);
// 启动后自动最大化显示
this->showMaximized();
// 初始化时隐藏label_work
ui->label_work->setVisible(false);
// 创建组合控件
// m_gridWithTable = new ImageGridWithTableWidget();
m_gridView = new ImageGridWidget();
m_deviceStatusWidget = new DeviceStatusWidget();
2025-08-31 21:08:28 +08:00
m_tearingDataTableWidget = new TearingDataTableWidget();
// 将设备状态widget添加到frame_dev中
2025-08-31 21:08:28 +08:00
QVBoxLayout* frameResultImageLayout = new QVBoxLayout(ui->detect_result);
frameResultImageLayout->setContentsMargins(0, 0, 0, 0);
frameResultImageLayout->addWidget(m_gridView);
// 将TearingDataTableWidget添加到detect_data中
QVBoxLayout* frameDataLayout = new QVBoxLayout(ui->detect_data);
frameDataLayout->setContentsMargins(0, 0, 0, 0);
frameDataLayout->addWidget(m_tearingDataTableWidget);
QVBoxLayout* frameDevLayout = new QVBoxLayout(ui->device_status);
frameDevLayout->setContentsMargins(0, 0, 0, 0);
frameDevLayout->addWidget(m_deviceStatusWidget);
// 初始化Presenter
m_presenter = new BeltTearingPresenter();
// 将设备状态控件与Presenter关联
m_presenter->setDeviceStatusWidget(m_deviceStatusWidget);
m_presenter->setStatusUpdate(this);
m_presenter->Init();
}
MainWindow::~MainWindow()
{
if(m_gridWithTable){
delete m_gridWithTable;
m_gridWithTable = nullptr;
}
if (m_deviceStatusWidget) {
delete m_deviceStatusWidget;
m_deviceStatusWidget = nullptr;
}
2025-08-31 21:08:28 +08:00
if (m_tearingDataTableWidget) {
delete m_tearingDataTableWidget;
m_tearingDataTableWidget = nullptr;
}
if (m_presenter) {
delete m_presenter;
m_presenter = nullptr;
}
delete ui;
}
2025-08-31 21:08:28 +08:00
void MainWindow::resizeEvent(QResizeEvent* event)
{
QMainWindow::resizeEvent(event);
// 获取窗口大小
QSize size = event->size();
int width = size.width();
int height = size.height();
// 调整title_group (groupBox) 宽度
ui->title_group->setGeometry(0, 0, width, 120);
// 调整btn_hide和btn_close位置
ui->btn_hide->move(width - 158, 32);
ui->btn_close->move(width - 79, 32);
// 调整detect_result控件
int detectResultWidth = width - 560 - 40 - 10; // 为两侧控件留出空间
int detectResultHeight = height - 160; // 减去标题栏高度
ui->detect_result->setGeometry(20, 140, detectResultWidth, detectResultHeight);
// 调整detect_data控件
int detectDataWidth = 560; // 保持宽度不变
int detectDataHeight = height - 140 - 160 - 10; // 减去标题栏和底部控件高度
ui->detect_data->setGeometry(20 + detectResultWidth + 10, 140, detectDataWidth, detectDataHeight);
// 调整device_status控件
int deviceStatusWidth = 560; // 保持宽度不变
int deviceStatusHeight = 140; // 保持高度不变
ui->device_status->setGeometry(20 + detectResultWidth + 10, height - 160, deviceStatusWidth, deviceStatusHeight);
}
void MainWindow::resizeToFitContent() {
if (!m_gridWithTable || m_gridWithTable->columnCount() == 0) {
return;
}
// 计算网格总宽度(列数 * 格子宽度 + 边距)
int gridWidth = m_gridWithTable->columnCount() * m_gridWithTable->tileBaseSize().width() + 32;
// 加上表格宽度
int totalWidth = gridWidth + 260;
// 计算总高度(行数 * 格子高度 + 边距)
int totalHeight = m_gridWithTable->rowCount() * m_gridWithTable->tileBaseSize().height() + 32;
// 设置窗口大小
resize(totalWidth, totalHeight);
}
void MainWindow::on_btn_hide_clicked()
{
// 最小化窗口
this->showMinimized();
}
void MainWindow::on_btn_close_clicked()
{
// 关闭应用程序
this->close();
}
void MainWindow::on_btn_test_clicked()
{
2025-08-31 21:08:28 +08:00
}
2025-08-31 21:08:28 +08:00
void MainWindow::on_btn_camera_clicked()
{
if(nullptr == ui_dialognetconfig){
ui_dialognetconfig = new DialogNetConfig(this);
}
connect(ui_dialognetconfig, &DialogNetConfig::configSaved, this, &MainWindow::onConfigSaved);
ui_dialognetconfig->show();
}
2025-08-31 21:08:28 +08:00
void MainWindow::onConfigSaved()
{
// 重新初始化Presenter
if (m_presenter) {
m_presenter->Init();
}
2025-08-31 21:08:28 +08:00
}
// IStatusUpdate接口方法实现
void MainWindow::OnStatusUpdate(const QString &statusMessage)
{
statusBar()->showMessage(statusMessage);
LOG_DEBUG("Status update: %s", statusMessage.toStdString().c_str());
}
// 回调需要显示几个图像
2025-08-31 21:08:28 +08:00
void MainWindow::OnNeedShowImageCount(const QStringList &deviceAliases)
{
2025-08-31 21:08:28 +08:00
// Handle the case when count is 0 (no images to show)
if (deviceAliases.isEmpty()) {
// Display a message in the grid view when there are no images to show
m_gridView->initImages(0);
LOG_DEBUG("No images to display\n");
} else {
m_gridView->initImages(deviceAliases.size());
// 为每个tile设置别名
for (int i = 0; i < deviceAliases.size(); ++i) {
m_gridView->setTileAlias(i, deviceAliases.at(i));
}
}
}
void MainWindow::OnTearingResult(const BeltTearingResult &result)
{
// 如果图像有效,显示在网格控件中
if (result.bImageValid && !result.image.isNull()) {
2025-08-31 21:08:28 +08:00
// 使用服务器名称作为别名
m_gridView->setImages(result.serverName, result.image);
} else if (result.bResultVaild) {
// 直接处理std::vector<TearingData>
m_tearingDataTableWidget->addData(result.result);
}
}
2025-08-31 21:08:28 +08:00
void MainWindow::OnServerConnected(const QString &serverName)
{
QString message = QString("已连接到服务器: %1").arg(serverName);
statusBar()->showMessage(message);
LOG_DEBUG("%s", message.toStdString().c_str());
}
void MainWindow::OnServerDisconnected(const QString &serverName)
{
QString message = QString("与服务器断开连接: %1").arg(serverName);
statusBar()->showMessage(message);
LOG_DEBUG("%s", message.toStdString().c_str());
}
void MainWindow::OnWorkStatusChanged(BeltTearingWorkStatus status)
{
QString statusStr;
switch (status) {
case BeltTearingWorkStatus::InitIng:
statusStr = "初始化中";
break;
case BeltTearingWorkStatus::Ready:
statusStr = "准备就绪";
break;
case BeltTearingWorkStatus::Working:
statusStr = "正在检测";
break;
case BeltTearingWorkStatus::Completed:
statusStr = "检测完成";
break;
case BeltTearingWorkStatus::Error:
statusStr = "设备异常";
break;
case BeltTearingWorkStatus::Disconnected:
statusStr = "连接断开";
break;
default:
statusStr = "未知状态";
break;
}
QString message = QString("工作状态: %1").arg(statusStr);
statusBar()->showMessage(message);
LOG_DEBUG("%s", message.toStdString().c_str());
}
void MainWindow::OnErrorOccurred(const QString &errorMessage)
{
statusBar()->showMessage("错误: " + errorMessage);
LOG_ERROR("Error occurred: %s", errorMessage.toStdString().c_str());
}