#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include "VrLog.h" #include #include #include 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(); m_tearingDataTableWidget = new TearingDataTableWidget(); // 将设备状态widget添加到frame_dev中 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; } if (m_tearingDataTableWidget) { delete m_tearingDataTableWidget; m_tearingDataTableWidget = nullptr; } if (m_presenter) { delete m_presenter; m_presenter = nullptr; } delete ui; } 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() { } void MainWindow::on_btn_camera_clicked() { } // IStatusUpdate接口方法实现 void MainWindow::OnStatusUpdate(const QString &statusMessage) { statusBar()->showMessage(statusMessage); LOG_DEBUG("Status update: %s", statusMessage.toStdString().c_str()); } // 回调需要显示几个图像 void MainWindow::OnNeedShowImageCount(const QStringList &deviceAliases) { // 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()) { // 使用服务器名称作为别名 m_gridView->setImages(result.serverName, result.image); } else if (result.bResultVaild) { // 直接处理std::vector m_tearingDataTableWidget->addData(result.result); } } 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()); }