#include "home.h" #include "titlebar.h" #include "statusstrip.h" #include "datacard.h" #include "confirmdialog.h" #include "car.h" #include #include #include #include #include "global.h" HomePage::HomePage(AppContext* ctx, QWidget* parent) : BasePage(ctx, parent) { QVBoxLayout* root = new QVBoxLayout(this); root->setContentsMargins(0, 0, 0, 0); root->setSpacing(0); m_titleBar = new TitleBar(ctx, this); m_titleBar->setTitle("系统首页面"); root->addWidget(m_titleBar); QHBoxLayout* main = new QHBoxLayout(); main->setContentsMargins(24, 20, 24, 20); main->setSpacing(24); // ===== 按钮统一样式(改这里即可同时调整对应的按钮)===== // 左侧 2 个菜单按钮(字号 50px;尺寸见 addMenu 里的 setFixedSize) const QString menuBtnStyle = QString("QPushButton{font-size:50px;background-color:%1;color:%2;border:1px solid %3;border-radius:12px;}" "QPushButton:hover,QPushButton:focus{background-color:%4;color:#FFFFFF;border:2px solid #8ABFFF;}") .arg(C::PANEL_HI, C::TEXT, C::BORDER, C::PRIMARY); // 右侧动作按钮(字号 55px;尺寸见下方各自的 setFixedSize) const QString actionBtnStyle = "QPushButton{font-size:55px;}"; // 左侧菜单(按钮在列内水平居中、垂直整体居中,选中发亮) QWidget* left = new QWidget(this); QVBoxLayout* leftLay = new QVBoxLayout(left); leftLay->setContentsMargins(10, 20, 10, 20); leftLay->setSpacing(100); auto addMenu = [&](const QString& t, PageId id) { QPushButton* b = button(t, "", left); b->setFixedSize(260, 100); // 固定尺寸(改这里同时调整 2 个菜单按钮) b->setStyleSheet(menuBtnStyle); connect(b, &QPushButton::clicked, this, [this, id]() { emit navigate(id); }); leftLay->addWidget(b, 0, Qt::AlignHCenter); // 不占拉伸因子,余量交给上下 stretch 均分 }; leftLay->addStretch(1); addMenu("故障查询", PageFault); addMenu("作业选择", PageJob); leftLay->addStretch(1); left->setFixedWidth(300); main->addWidget(left); // 中央卡片区(2×2,与作业选择页一致) QWidget* center = new QWidget(this); QGridLayout* grid = new QGridLayout(center); grid->setSpacing(24); grid->setContentsMargins(0, 0, 0, 0); m_chassisCard = new DataCard("底盘", center); m_chassisCard->addField("电量", "85%"); m_chassisCard->addField("电压", "360V"); m_chassisCard->addField("故障", "无"); m_armCard = new DataCard("机械臂", center); m_armCard->addField("末端位置", "XYZ"); m_armCard->addField("姿态", "RX/RY/RZ"); m_washCard = new DataCard("洗消", center); m_washCard->addField("A液位", "100L"); m_washCard->addField("泡沫液位", "30L"); m_gasCard = new DataCard("气体检测仪", center); m_gasCard->addField("主机状态", "待机"); m_gasCard->addField("浓度", "0 ppb"); // 左列 底盘/机械臂,右列 洗消/气体检测仪 grid->addWidget(m_chassisCard, 0, 0); grid->addWidget(m_washCard, 0, 1); grid->addWidget(m_armCard, 1, 0); grid->addWidget(m_gasCard, 1, 1); main->addWidget(center, 1); // 右侧按钮列(等分填满整列,选中发亮) QWidget* right = new QWidget(this); QVBoxLayout* rightLay = new QVBoxLayout(right); rightLay->setContentsMargins(0, 0, 0, 0); rightLay->setSpacing(24); QPushButton* debug = button("调试维护", "", right); debug->setFixedSize(240, 100); debug->setStyleSheet(actionBtnStyle); connect(debug, &QPushButton::clicked, this, [this]() { emit navigate(PageDebug); }); QPushButton* help = button("操作说明", "", right); help->setFixedSize(240, 100); help->setStyleSheet(actionBtnStyle); connect(help, &QPushButton::clicked, this, &HomePage::onHelp); QPushButton* spare = button("备用", "", right); spare->setFixedSize(240, 100); spare->setStyleSheet(actionBtnStyle); spare->setEnabled(false); // 预留功能:置灰禁用,不接任何跳转 rightLay->addStretch(1); rightLay->addWidget(debug, 0, Qt::AlignHCenter); rightLay->addStretch(1); rightLay->addWidget(help, 0, Qt::AlignHCenter); rightLay->addStretch(1); rightLay->addWidget(spare, 0, Qt::AlignHCenter); rightLay->addStretch(1); right->setFixedWidth(360); main->addWidget(right); root->addLayout(main, 1); m_statusStrip = new StatusStrip(ctx, this); m_statusStrip->setBackVisible(false); m_statusStrip->setModeVisible(false); // 本页不显示模式徽标(菜单已移到左右两列) root->addWidget(m_statusStrip); connect(ctx->comm(), &CarCommunication::telemetryUpdated, this, &HomePage::refresh); refresh(); } void HomePage::refresh() { const Telemetry& t = ctx()->telemetry; m_chassisCard->setField(0, QString("%1%").arg(t.soc)); m_chassisCard->setField(1, QString("%1V").arg(t.volt, 0, 'f', 0)); m_chassisCard->setField(2, t.chassisFaults.isEmpty() ? "无" : t.chassisFaults.join(";")); m_chassisCard->setAlarm(2, !t.chassisFaults.isEmpty()); m_armCard->setField(0, t.pos); m_armCard->setField(1, t.pose); m_washCard->setField(0, QString("%1L").arg(t.levelA, 0, 'f', 0)); m_washCard->setField(1, QString("%1L").arg(t.levelFoam, 0, 'f', 0)); m_gasCard->setField(0, t.gasHost == "detecting" ? "检测中" : (t.gasHost == "fault" ? "故障" : "待机")); m_gasCard->setField(1, QString("%1 ppb").arg(t.gasConc, 0, 'f', 0)); m_gasCard->setAlarm(1, t.gasConc > 500.0); } void HomePage::onHelp() { ConfirmDialog::message(this, "操作说明", "系统自检将依次检测:通信系统、底盘通信、机械臂通信、洗消通信、" "传感器信号、清水液位及电动球阀 D1/D2 的开启与关闭。\n" "全部正常后方可进入作业选择界面。"); }