#include "titlebar.h" #include "ledindicator.h" #include "appcontext.h" #include "udpcommunication.h" #include "confirmdialog.h" #include #include #include #include #include "global.h" #include TitleBar::TitleBar(AppContext* ctx, QWidget* parent) : QWidget(parent), m_ctx(ctx) { setObjectName("TitleBar"); setFixedHeight(98); setStyleSheet(QString("QWidget#TitleBar{background-color:%1;border-bottom:1px solid %2;}") .arg(C::PANEL, C::BORDER)); // 左侧区(通信状态) QWidget* leftBox = new QWidget(this); QHBoxLayout* leftLay = new QHBoxLayout(leftBox); leftLay->setContentsMargins(0, 0, 0, 0); leftLay->setSpacing(20); m_comm = new LedIndicator("通信正常", leftBox); m_comm->setState(LedIndicator::Green); leftLay->addWidget(m_comm); leftLay->addStretch(1); // 右侧区(时间 + 软急停) QWidget* rightBox = new QWidget(this); QHBoxLayout* rightLay = new QHBoxLayout(rightBox); rightLay->setContentsMargins(0, 0, 0, 0); rightLay->setSpacing(20); m_time = new QLabel("", rightBox); m_time->setStyleSheet(QString("color:%1;font-size:60px;").arg(C::TEXT_SUB)); m_time->setAlignment(Qt::AlignCenter); m_estop = new QPushButton("急停", rightBox); m_estop->setProperty("variant", "estop"); m_estop->setStyleSheet("font-size:60px;"); m_estop->setFixedSize(180, 80); rightLay->addStretch(1); rightLay->addWidget(m_time); rightLay->addWidget(m_estop); // 左右两侧等宽 → 中间标题恰好居中于屏幕 const int sideW = 380; // 需 >= 较宽一侧所需宽度(右侧:时间 + 急停) leftBox->setFixedWidth(sideW); rightBox->setFixedWidth(sideW); // 标题(居中) m_title = new QLabel("", this); m_title->setAlignment(Qt::AlignCenter); m_title->setStyleSheet(QString("color:%1;font-size:60px;font-weight:700;").arg(C::TEXT)); QHBoxLayout* lay = new QHBoxLayout(this); lay->setContentsMargins(24, 6, 24, 6); lay->setSpacing(0); lay->addWidget(leftBox); lay->addWidget(m_title, 1); lay->addWidget(rightBox); connect(m_estop, &QPushButton::clicked, this, [this]() { if (m_ctx->estopTriggered) { if (ConfirmDialog::confirm(window(), "急停复位", "确定复位急停并恢复系统?")) m_ctx->resetEstop(); } else { m_ctx->triggerEstop(); } }); // 通信状态刷新 connect(m_ctx->comm(), &UdpCommunication::commOkChanged, this, [this](bool ok) { if (ok) { m_comm->setText("通信正常"); m_comm->setState(LedIndicator::Green); } else { m_comm->setText("通信异常"); m_comm->setState(LedIndicator::RedBlink); } }); // 急停状态刷新 connect(m_ctx, &AppContext::estopChanged, this, &TitleBar::updateEstop); updateEstop(); // 时钟 m_clock = new QTimer(this); connect(m_clock, &QTimer::timeout, this, &TitleBar::updateTime); m_clock->start(1000); updateTime(); } void TitleBar::setTitle(const QString& title) { m_title->setText(title); } void TitleBar::setEstopVisible(bool visible) { m_estop->setVisible(visible); } void TitleBar::updateEstop() { if (m_ctx->estopTriggered) { m_estop->setText("复位"); m_estop->setProperty("variant", "danger"); } else { m_estop->setText("急停"); m_estop->setProperty("variant", "estop"); } m_estop->style()->unpolish(m_estop); m_estop->style()->polish(m_estop); } void TitleBar::updateTime() { m_time->setText(QTime::currentTime().toString("HH:mm")); }