2025-12-10 00:01:32 +08:00

82 lines
3.4 KiB
C++

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDateTime>
#include <QMetaType>
#include <thread>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_presenter(nullptr)
{
ui->setupUi(this);
m_logModel = new QStringListModel(this);
ui->listView_log->setModel(m_logModel);
qRegisterMetaType<WorkpiecePositionDetectionResult>("WorkpiecePositionDetectionResult");
qRegisterMetaType<WorkStatus>("WorkStatus");
qRegisterMetaType<WorkpieceCenterPosition>("WorkpieceCenterPosition");
connect(this, &MainWindow::workStatusUpdateRequested, this, &MainWindow::updateWorkStatusLabel);
connect(this, &MainWindow::detectionResultUpdateRequested, this, &MainWindow::updateDetectionResultDisplay);
connect(this, &MainWindow::logUpdateRequested, this, &MainWindow::updateDetectionLog);
Init();
}
MainWindow::~MainWindow()
{
if (m_presenter) delete m_presenter;
delete ui;
}
void MainWindow::updateStatusLog(const QString& message) { emit logUpdateRequested(message); }
void MainWindow::Init()
{
m_presenter = new WorkpiecePositionPresenter();
m_presenter->SetStatusCallback(this);
std::thread([this]() { m_presenter->Init(); }).detach();
}
void MainWindow::OnStatusUpdate(const std::string& msg) { updateStatusLog(QString::fromStdString(msg)); }
void MainWindow::OnDetectionResult(const WorkpiecePositionDetectionResult& result) { emit detectionResultUpdateRequested(result); }
void MainWindow::OnBinocularMarkConnectionChanged(bool connected) { updateStatusLog(QString("BinocularMark: %1").arg(connected ? "已连接" : "断开")); }
void MainWindow::OnEpicEyeConnectionChanged(bool connected) { updateStatusLog(QString("EpicEye: %1").arg(connected ? "已连接" : "断开")); }
void MainWindow::OnWorkStatusChanged(WorkStatus status) { emit workStatusUpdateRequested(status); }
void MainWindow::updateWorkStatusLabel(WorkStatus status)
{
ui->label_status->setText(QString::fromStdString(WorkStatusToString(status)));
}
void MainWindow::updateDetectionResultDisplay(const WorkpiecePositionDetectionResult& result)
{
displayMarkData(result.marks);
if (!result.positions.empty()) displayCenterPosition(result.positions[0]);
}
void MainWindow::updateDetectionLog(const QString& message)
{
if (!m_logModel) return;
QStringList list = m_logModel->stringList();
list.append(QString("[%1] %2").arg(QDateTime::currentDateTime().toString("hh:mm:ss")).arg(message));
m_logModel->setStringList(list);
}
void MainWindow::on_btn_start_clicked() { if (m_presenter) m_presenter->StartDetection(); }
void MainWindow::on_btn_stop_clicked() { if (m_presenter) m_presenter->StopDetection(); }
void MainWindow::displayMarkData(const std::vector<VrMark3D>& marks)
{
QString info = QString("%1个Mark:\n").arg(marks.size());
for (size_t i = 0; i < marks.size(); i++) {
info += QString("%1: ID=%2 (%.2f,%.2f,%.2f)\n").arg(i+1).arg(marks[i].markID)
.arg(marks[i].x,0,'f',2).arg(marks[i].y,0,'f',2).arg(marks[i].z,0,'f',2);
}
ui->textEdit_marks->setPlainText(info);
}
void MainWindow::displayCenterPosition(const WorkpieceCenterPosition& pos)
{
QString info = QString("中心点:\nX:%.2f\nY:%.2f\nZ:%.2f").arg(pos.x,0,'f',2).arg(pos.y,0,'f',2).arg(pos.z,0,'f',2);
ui->textEdit_center->setPlainText(info);
}