#include "mainwindow.h" #include "appcontext.h" #include "udpcommunication.h" #include "confirmdialog.h" #include "base.h" #include "bootpassword.h" #include "warning.h" #include "passwordmgmtlogin.h" #include "passwordmgmt.h" #include "passwordreset.h" #include "selfcheck.h" #include "jobselect.h" #include "chassis.h" #include "arm.h" #include "gasdetector.h" #include "manualclean.h" #include "manualdisinfect.h" #include "debugmaintain.h" #include "faultquery.h" #include #include #include #include MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { m_ctx = AppContext::instance(); setWindowTitle("玉兔工业无线遥控器 YTZT6K8EART2-aL25"); setWindowFlags(Qt::FramelessWindowHint | Qt::Window); setFixedSize(SCREEN_W, SCREEN_H); // 中央堆栈 m_stack = new QStackedWidget(this); m_stack->setObjectName("StackedWidget"); setCentralWidget(m_stack); buildPages(); // 全局急停横幅(覆盖于页面之上) m_estopBanner = new QLabel("急停已触发,请复位", this); m_estopBanner->setAlignment(Qt::AlignCenter); m_estopBanner->setStyleSheet( "background-color:#E5484D;color:#FFFFFF;font-size:30px;font-weight:700;"); m_estopBanner->setGeometry(0, 98, SCREEN_W, 64); m_estopBanner->hide(); connect(m_ctx, &AppContext::estopChanged, this, &MainWindow::onEstopChanged); // 启动通信层(UDP 收包发包) m_ctx->comm()->start(); // 初始页面:开机密码 // m_stack->setCurrentIndex(PageBoot); // 免密码直接进自检页(恢复原流程时改回上面的 PageBoot) m_stack->setCurrentIndex(PageSelfCheck); } MainWindow::~MainWindow() { } void MainWindow::buildPages() { m_pages.fill(nullptr, PageCount); auto add = [this](PageId id, BasePage* p) { m_pages[id] = p; m_stack->addWidget(p); connect(p, &BasePage::navigate, this, &MainWindow::onNavigate); }; add(PageBoot, new BootPasswordPage(m_ctx)); add(PageWarning, new WarningPage(m_ctx)); add(PageMgmtLogin, new PasswordMgmtLoginPage(m_ctx)); add(PageMgmt, new PasswordMgmtPage(m_ctx)); add(PageReset, new PasswordResetPage(m_ctx)); add(PageSelfCheck, new SelfCheckPage(m_ctx)); add(PageJob, new JobSelectPage(m_ctx)); add(PageChassis, new ChassisPage(m_ctx)); add(PageArm, new ArmPage(m_ctx)); add(PageGas, new GasDetectorPage(m_ctx)); add(PageClean, new ManualCleanPage(m_ctx)); add(PageDisinfect, new ManualDisinfectPage(m_ctx)); add(PageDebug, new DebugMaintainPage(m_ctx)); add(PageFault, new FaultQueryPage(m_ctx)); m_faultPage = qobject_cast(page(PageFault)); } void MainWindow::onNavigate(PageId id) { // 记录故障查询返回来源 if (id == PageFault && m_faultPage) { PageId cur = static_cast(m_stack->currentIndex()); m_faultPage->setReturnPage((cur == PageSelfCheck) ? PageSelfCheck : PageJob); } if (id >= 0 && id < PageCount) m_stack->setCurrentIndex(id); } void MainWindow::onEstopChanged(bool triggered) { m_estopBanner->setVisible(triggered); m_estopBanner->raise(); } void MainWindow::keyPressEvent(QKeyEvent* ev) { // 演示用快捷键:M 切换行车/机械臂模式,E 触发/复位急停 switch (ev->key()) { case Qt::Key_M: m_ctx->setMode(m_ctx->mode == Mode::Drive ? Mode::Arm : Mode::Drive); break; case Qt::Key_E: if (m_ctx->estopTriggered) m_ctx->resetEstop(); else m_ctx->triggerEstop(); break; default: QMainWindow::keyPressEvent(ev); } }