#include "mainwindow.h" #include "appcontext.h" #include "car.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 "home.h" #include "jobselect.h" #include "chassis.h" #include "arm.h" #include "gasdetector.h" #include "washpage.h" #include "debugmaintain.h" #include "faultquery.h" #include #include #include MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { m_ctx = AppContext::instance(); setWindowTitle("玉兔工业无线遥控器"); setWindowFlags(Qt::FramelessWindowHint | Qt::Window); setFixedSize(SCREEN_W, SCREEN_H); // 中央堆栈 m_stack = new QStackedWidget(this); m_stack->setObjectName("StackedWidget"); setCentralWidget(m_stack); buildPages(); // 全局急停横幅(覆盖于页面之上):仅作提示。 // 急停与复位都由遥控器 bit4 下发,面板不提供复位控件。 m_estopBanner = new QLabel("急停已触发,请用遥控器复位!", this); m_estopBanner->setAlignment(Qt::AlignCenter); m_estopBanner->setStyleSheet( "background-color:#E5484D;color:#FFFFFF;font-size:50px;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_ctx->rc()->start(); // 遥控器接收(独立端口) // 初始页面:开机密码 →(验证通过)自检 →(自检结束)系统首页面 m_stack->setCurrentIndex(PageBoot); } 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(PageHome, new HomePage(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 WashPage(m_ctx, WashPage::Clean)); add(PageDisinfect, new WashPage(m_ctx, WashPage::Disinfect)); add(PageDebug, new DebugMaintainPage(m_ctx)); add(PageFault, new FaultQueryPage(m_ctx)); m_faultPage = qobject_cast(page(PageFault)); m_debugPage = qobject_cast(page(PageDebug)); } void MainWindow::onNavigate(PageId id) { // 记录故障查询返回来源(自检页 / 系统首页面 进入时原路返回,其它一律回作业选择页) if (id == PageFault && m_faultPage) { PageId cur = static_cast(m_stack->currentIndex()); if (cur == PageSelfCheck || cur == PageHome) m_faultPage->setReturnPage(cur); else m_faultPage->setReturnPage(PageJob); } // 调试维护有两个入口(系统首页 / 作业选择),同样原路返回 if (id == PageDebug && m_debugPage) { PageId cur = static_cast(m_stack->currentIndex()); m_debugPage->setReturnPage(cur == PageHome ? PageHome : PageJob); } if (id >= 0 && id < PageCount) m_stack->setCurrentIndex(id); } void MainWindow::onEstopChanged(bool triggered) { m_estopBanner->setVisible(triggered); m_estopBanner->raise(); }