Files
QT_wuhan_YT/pages/jobselect.cpp
T
2026-10-16 09:06:03 +08:00

153 lines
6.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "jobselect.h"
#include "titlebar.h"
#include "statusstrip.h"
#include "datacard.h"
#include "car.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QPushButton>
#include "global.h"
JobSelectPage::JobSelectPage(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);
// ===== 按钮统一样式(改这里即可同时调整对应的按钮)=====
// 左侧 4 个菜单按钮(字号 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); // 固定尺寸(改这里同时调整 4 个菜单按钮)
b->setStyleSheet(menuBtnStyle);
connect(b, &QPushButton::clicked, this, [this, id]() { emit navigate(id); });
leftLay->addWidget(b, 0, Qt::AlignHCenter); // 不占拉伸因子,余量交给上下 stretch 均分
};
leftLay->addStretch(1);
addMenu("机器人底盘", PageChassis);
addMenu("机械臂", PageArm);
addMenu("气体检测仪", PageGas);
addMenu("调试维护", PageDebug);
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("底盘电量SOC", "--");
m_chassisCard->addField("底盘电压U", "--");
m_armCard = new DataCard("机械臂", center);
// 位置/姿态两行的数值最长约 554px,超出 2×2 卡片的内容区 522px,单独把字号收小一号
m_armCard->setValueFontPx(38);
m_armCard->addField("末端位置", "--");
m_armCard->addField("末端姿态", "--");
m_washCard = new DataCard("洗消", center);
m_washCard->addField("A组分/清水液位", "--");
m_washCard->addField("泡沫箱液位", "--");
m_gasCard = new DataCard("气体检测仪", center);
m_gasCard->addField("主机状态", "--");
m_gasCard->addField("有毒物种类", "--");
m_gasCard->addField("有毒物等级", "--");
// 左列 底盘/机械臂,右列 洗消/气体检测仪
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* clean = button("消除作业", "", right);
clean->setFixedSize(240, 100);
clean->setStyleSheet(actionBtnStyle);
connect(clean, &QPushButton::clicked, this, [this]() { emit navigate(PageClean); });
QPushButton* disinfect = button("消毒作业", "", right);
disinfect->setFixedSize(240, 100);
disinfect->setStyleSheet(actionBtnStyle);
connect(disinfect, &QPushButton::clicked, this, [this]() { emit navigate(PageDisinfect); });
// 返回:回系统首页面(⑤系统首页面 → ⑥作业选择)
QPushButton* back = button("返回", "", right);
back->setFixedSize(240, 100);
back->setStyleSheet(cancelButtonStyle(55)); // 选中(悬停/按下/焦点)红底白字
// connect(back, &QPushButton::clicked, this, [this]() { emit navigate(PageSelfCheck); }); // 原:回自检页
connect(back, &QPushButton::clicked, this, [this]() { emit navigate(PageHome); });
rightLay->addStretch(1);
rightLay->addWidget(clean, 0, Qt::AlignHCenter);
rightLay->addStretch(1);
rightLay->addWidget(disinfect, 0, Qt::AlignHCenter);
rightLay->addStretch(1);
rightLay->addWidget(back, 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); // 本页「返回」在右侧按钮列,底条不重复放
root->addWidget(m_statusStrip);
connect(ctx->comm(), &CarCommunication::telemetryUpdated, this, &JobSelectPage::refresh);
refresh();
}
void JobSelectPage::refresh()
{
const Telemetry& t = ctx()->telemetry;
// 未收到对应报文的数值统一显示 "--"(dashIf)
m_chassisCard->setField(0, dashIf(t.hasBattery, QString("%1%").arg(t.soc)));
m_chassisCard->setField(1, dashIf(t.hasBattery, QString("%1V").arg(t.volt, 0, 'f', 0)));
m_chassisCard->setFaults(t.chassisFaults);
m_armCard->setField(0, t.pos);
m_armCard->setField(1, t.pose);
// 机械臂卡没有故障行:协议里机械臂那四帧只有位置/姿态/关节角,没有故障信号
m_washCard->setField(0, dashIf(t.hasWash, QString("%1L").arg(t.levelA, 0, 'f', 0)));
m_washCard->setField(1, dashIf(t.hasWash, QString("%1L").arg(t.levelFoam, 0, 'f', 0)));
m_washCard->setAlarm(0, t.levelALow);
m_washCard->setAlarm(1, t.levelBLow);
m_washCard->setFaults(washCardFaults(t));
m_gasCard->setField(0, gasHostLabel(t));
m_gasCard->setField(1, t.gasType); // 有毒物种类,未收到报文时本身就是 "--"
m_gasCard->setField(2, t.gasLevel); // 有毒物等级
m_gasCard->setAlarm(0, t.gasHost == "fault");
m_gasCard->setFaults(t.detectorFaults);
}