#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 #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); // 免密码直接进自检页 // m_stack->setCurrentIndex(PageSelfCheck); // 免登录直接进作业选择页(恢复原流程时改回上面的 PageBoot) m_stack->setCurrentIndex(PageJob); } 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)); } 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 >= 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 切换行车/机械臂模式。 // 遥控器在线时模式由遥控器报文决定,此处不抢(与底盘页 showEvent 同一规则)。 switch (ev->key()) { case Qt::Key_M: if (!m_ctx->rc()->linkOk()) m_ctx->setMode(m_ctx->mode == Mode::Drive ? Mode::Arm : Mode::Drive); break; default: QMainWindow::keyPressEvent(ev); } }