#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include 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"); qRegisterMetaType("WorkStatus"); qRegisterMetaType("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& 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); }