GrabBag/GrabBagApp/mainwindow.cpp
杰仔 ae2f795d2c 初步的页面和流程
TestDATA的增加
ARM版本初步编译(代码通过,缺少opencv)
2025-06-17 00:37:05 +08:00

390 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include <QStandardItemModel>
#include <QDebug>
#include <QPainter>
#include <QBrush>
#include <QMessageBox>
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 设置状态栏字体
QFont statusFont = statusBar()->font();
statusFont.setPointSize(12);
statusBar()->setFont(statusFont);
// 设置状态栏颜色和padding
statusBar()->setStyleSheet("QStatusBar { color: rgb(239, 241, 245); padding: 20px; }");
// 启动后自动全屏显示
this->showFullScreen();
// 初始化GraphicsScene
QGraphicsScene* scene = new QGraphicsScene(this);
ui->detect_image->setScene(scene);
// 初始化ListView的Model
QStandardItemModel* model = new QStandardItemModel(this);
ui->detect_result->setModel(model);
// 设置label前圆点在线/离线)
setStatusDot(ui->label_camera_1_status, false); // 在线绿色
setStatusDot(ui->label_camera_2_status, false); // 在线绿色
setStatusDot(ui->label_robot_status, false); // 在线绿色
// 连接菜单信号
// connect(ui->menu_camera, &QMenu::aboutToShow, this, &MainWindow::on_menu_camera_triggered);
// connect(ui->menu_config, &QMenu::aboutToShow, this, &MainWindow::on_menu_config_triggered);
// connect(ui->menu_camera_adjust, &QMenu::aboutToShow, this, &MainWindow::on_menu_camera_adjust_triggered);
// 连接工作状态更新信号槽
connect(this, &MainWindow::workStatusUpdateRequested, this, &MainWindow::updateWorkStatusLabel);
// 连接检测结果更新信号槽
connect(this, &MainWindow::detectionResultUpdateRequested, this, &MainWindow::updateDetectionResultDisplay);
updateStatusLog(tr("就绪"));
// 初始化模块
Init();
}
MainWindow::~MainWindow()
{
// 释放业务逻辑处理类
if (m_presenter) {
delete m_presenter;
m_presenter = nullptr;
}
delete ui;
}
void MainWindow::updateStatusLog(const QString& message)
{
statusBar()->showMessage(message);
}
void MainWindow::Init()
{
// 创建业务逻辑处理类
m_presenter = new GrabBagPresenter();
// 设置状态回调接口
m_presenter->SetStatusCallback(this);
// 初始化业务逻辑
int result = m_presenter->Init();
if (result != 0) {
updateStatusLog(tr("初始化失败,错误码:%1").arg(result));
}
}
void MainWindow::displayImage(const QImage& image)
{
if (image.isNull()) {
updateStatusLog(tr("图片无效"));
return;
}
QGraphicsScene* scene = ui->detect_image->scene();
scene->clear();
QPixmap pixmap = QPixmap::fromImage(image);
scene->addPixmap(pixmap);
ui->detect_image->fitInView(scene->sceneRect(), Qt::KeepAspectRatio);
}
// 添加扩展版本的检测结果函数
void MainWindow::addDetectionResult(const DetectionResult& result)
{
auto layoutIter = result.positionLayout.begin();
while(layoutIter != result.positionLayout.end())
{
QString posStr = QString("\n第%1层\n").arg(layoutIter->layerIndex);
auto positionIter = layoutIter->position.begin();
while(positionIter != layoutIter->position.end())
{
posStr += QString("坐标: X=%1\n坐标: Y=%2\n坐标: Z=%3\n旋转: RZ=%4\n")
.arg(positionIter->x, 0, 'f', 2)
.arg(positionIter->y, 0, 'f', 2)
.arg(positionIter->z, 0, 'f', 2)
.arg(positionIter->yaw, 0, 'f', 2);
positionIter++;
}
layoutIter++;
QStandardItemModel* model = qobject_cast<QStandardItemModel*>(ui->detect_result->model());
if (model) {
QStandardItem* item = new QStandardItem(posStr);
model->appendRow(item);
}
}
}
// setStatusDot实现移到MainWindow类作用域内
void MainWindow::setStatusDot(QLabel* label, bool isOnline) {
QPixmap dot(18, 18);
dot.fill(Qt::transparent);
QPainter painter(&dot);
painter.setRenderHint(QPainter::Antialiasing);
QColor color = isOnline ? QColor(140, 180, 60) : QColor(220, 60, 60); // 绿色或红色
painter.setBrush(QBrush(color));
painter.setPen(Qt::NoPen);
painter.drawEllipse(0, 0, 18, 18);
painter.end();
label->setPixmap(dot);
label->setScaledContents(true);
label->setFixedSize(18, 18);
}
void MainWindow::on_btn_camera_clicked()
{
// if(nullptr == ui_dialogCamera){
// ui_dialogCamera = new DialogCamera;
// }
// ui_dialogCamera->show();
}
void MainWindow::on_btn_config_clicked()
{
if(nullptr == ui_dialogConfig){
ui_dialogConfig = new DialogConfig;
}
ui_dialogConfig->show();
}
void MainWindow::on_btn_flow_clicked()
{
// 机械臂连接/断开
static bool isConnected = false;
isConnected = !isConnected;
}
void MainWindow::on_btn_start_clicked()
{
// 使用Presenter启动检测
if (m_presenter) {
m_presenter->StartDetection();
}
}
void MainWindow::on_btn_stop_clicked()
{
if (m_presenter) {
m_presenter->StopDetection();
}
}
//void MainWindow::on_menu_camera_triggered()
//{
// qDebug() << __func__ ;
//}
//void MainWindow::on_menu_config_triggered()
//{
// qDebug() << __func__ ;
// if(nullptr == ui_dialogConfig){
// ui_dialogConfig = new DialogConfig(this);
// }
// ui_dialogConfig->show();
//}
void MainWindow::on_menu_camera_adjust_triggered()
{
}
// 状态更新槽函数
void MainWindow::OnStatusUpdate(const std::string& statusMessage)
{
updateStatusLog(QString::fromStdString(statusMessage));
}
void MainWindow::OnDetectionResult(const DetectionResult& result)
{
// 通过信号槽机制更新UI确保在主线程中执行
emit detectionResultUpdateRequested(result);
}
void MainWindow::OnCamera1StatusChanged(bool isConnected)
{
// 更新相机1状态指示灯
setStatusDot(ui->label_camera_1_status, isConnected);
// 更新状态消息
QString statusMsg = isConnected ? tr("相机一已连接") : tr("相机一已断开");
ui->label_camera_1_txt->setText(statusMsg);
updateStatusLog(statusMsg);
}
// 相机2状态更新槽函数
void MainWindow::OnCamera2StatusChanged(bool isConnected)
{
// 更新相机2状态指示灯
setStatusDot(ui->label_camera_2_status, isConnected);
// 更新状态消息
QString statusMsg = isConnected ? tr("相机二已连接") : tr("相机二已断开");
ui->label_camera_2_txt->setText(statusMsg);
updateStatusLog(statusMsg);
}
// 相机个数更新槽函数
void MainWindow::OnCameraCountChanged(int cameraCount)
{
// 如果只有一个相机隐藏相机2相关UI元素
if (cameraCount < 2) {
// 隐藏相机2状态标签和图标
ui->label_camera_2_txt->setVisible(false);
ui->label_camera_2_status->setVisible(false);
// 更新状态消息
updateStatusLog(tr("系统使用单相机模式"));
} else {
// 显示相机2状态标签和图标
ui->label_camera_2_txt->setVisible(true);
ui->label_camera_2_status->setVisible(true);
// 更新状态消息
updateStatusLog(tr("系统使用双相机模式"));
}
}
// 机械臂状态更新槽函数
void MainWindow::OnRobotConnectionChanged(bool isConnected)
{
// 更新机械臂状态指示灯
setStatusDot(ui->label_robot_status, isConnected);
// 更新状态消息
QString statusMsg = isConnected ? tr("机械臂已连接") : tr("机械臂已断开");
updateStatusLog(statusMsg);
}
// 工作状态更新槽函数
void MainWindow::OnWorkStatusChanged(WorkStatus status)
{
// 通过信号槽机制更新UI确保在主线程中执行
emit workStatusUpdateRequested(status);
}
void MainWindow::updateWorkStatusLabel(WorkStatus status)
{
// 获取状态对应的显示文本
QString statusText = QString::fromStdString(WorkStatusToString(status));
// 在label_work中显示状态
if (ui->label_work) {
ui->label_work->setText(statusText);
// 根据不同状态设置不同的样式
switch (status) {
case WorkStatus::Ready:
ui->label_work->setStyleSheet("color: green;");
break;
case WorkStatus::Working:
ui->label_work->setStyleSheet("color: blue;");
break;
case WorkStatus::Completed:
ui->label_work->setStyleSheet("color: green; font-weight: bold;");
break;
case WorkStatus::Error:
ui->label_work->setStyleSheet("color: red; font-weight: bold;");
break;
default:
ui->label_work->setStyleSheet("");
break;
}
}
// 同时更新状态栏信息
updateStatusLog(statusText);
}
void MainWindow::updateDetectionResultDisplay(const DetectionResult& result)
{
// 显示检测图像
displayImage(result.image);
// 更新检测结果到列表
addDetectionResult(result);
// 更新目标面板显示
// updateTargetPanels(result);
}
void MainWindow::on_action_camera_1_triggered()
{
IVrEyeDevice* pDevice = m_presenter->GetEyeDevice(0);
if(nullptr == pDevice){
QMessageBox::warning(this, "设备错误", "相机设备未正确初始化!");
return;
}
if(nullptr == ui_dialogCamera){
ui_dialogCamera = new DialogCamera(pDevice, this);
}
ui_dialogCamera->show();
}
void MainWindow::on_action_camera_2_triggered()
{
IVrEyeDevice* pDevice = m_presenter->GetEyeDevice(1);
if(nullptr == pDevice){
QMessageBox::warning(this, "设备错误", "相机设备未正确初始化!");
return;
}
if(nullptr == ui_dialogCamera){
ui_dialogCamera = new DialogCamera(pDevice, this);
}
ui_dialogCamera->show();
}
void MainWindow::on_action_tool_debug_data_triggered()
{
// 打开文件选择对话框
QString fileName = QFileDialog::getOpenFileName(
this,
tr("选择调试数据文件"),
QString(),
tr("激光数据文件 (*.txt);;所有文件 (*.*)")
);
if (fileName.isEmpty()) {
// 用户取消了文件选择
return;
}
// 检查Presenter是否已初始化
if (!m_presenter) {
QMessageBox::warning(this, tr("错误"), tr("系统未正确初始化!"));
return;
}
std::thread t([this, fileName]() {
updateStatusLog(tr("正在加载调试数据文件: %1").arg(fileName));
int result = m_presenter->LoadDebugDataAndDetect(fileName.toStdString());
if (result == 0) {
updateStatusLog(tr("调试数据加载和检测成功"));
} else {
QString errorMsg = tr("调试数据加载失败,错误码: %1").arg(result);
updateStatusLog(errorMsg);
QMessageBox::warning(this, tr("错误"), errorMsg);
}
});
t.detach();
}