Files
QT_wuhan_YT/pages/jobselect.cpp
T
2026-10-14 09:59:42 +08:00

145 lines
5.9 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("电量", "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* 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);
m_statusStrip->setModeVisible(false); // 本页不显示模式徽标(返回按钮已移到右侧列)
root->addWidget(m_statusStrip);
connect(ctx->comm(), &CarCommunication::telemetryUpdated, this, &JobSelectPage::refresh);
refresh();
}
void JobSelectPage::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);
}