97 lines
3.3 KiB
C++
97 lines
3.3 KiB
C++
#include "titlebar.h"
|
||
#include "ledindicator.h"
|
||
#include "appcontext.h"
|
||
#include "car.h"
|
||
#include <QHBoxLayout>
|
||
#include <QLabel>
|
||
#include "global.h"
|
||
|
||
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(260, 0, 0, 0);
|
||
leftLay->setSpacing(20);
|
||
m_comm = new LedIndicator("通信正常", leftBox);
|
||
m_comm->setFixedHeight(80); // 容纳放大后的文字,避免上下裁切
|
||
m_comm->setTextPixelSize(45);
|
||
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, 20, 0);
|
||
rightLay->setSpacing(30);
|
||
rightLay->addStretch(1);
|
||
m_rc = new LedIndicator("遥控器断开", rightBox);
|
||
m_rc->setFixedHeight(80);
|
||
m_rc->setTextPixelSize(45);
|
||
m_rc->setState(LedIndicator::RedBlink);
|
||
rightLay->addWidget(m_rc);
|
||
m_rcBat = new QLabel("--%", rightBox);
|
||
m_rcBat->setStyleSheet(QString("color:%1;font-size:60px;").arg(C::TEXT_SUB));
|
||
m_rcBat->setAlignment(Qt::AlignCenter);
|
||
rightLay->addWidget(m_rcBat);
|
||
|
||
// 左右两侧等宽 → 中间标题恰好居中于屏幕
|
||
// 左区需 260(左边距)+ 240(圆点区与留白 60 + 文字 4×45)= 500
|
||
// 右区需 285(圆点区与留白 60 + 文字 5×45)+ 30 + 130(电量)+ 20 = 465
|
||
const int sideW = 520;
|
||
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_ctx->comm(), &CarCommunication::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->rc(), &RcCommunication::linkChanged, this, &TitleBar::onRcLink);
|
||
connect(m_ctx->rc(), &RcCommunication::frameReceived, this, &TitleBar::onRcFrame);
|
||
onRcLink(m_ctx->rc()->linkOk());
|
||
}
|
||
|
||
void TitleBar::setTitle(const QString& title)
|
||
{
|
||
m_title->setText(title);
|
||
}
|
||
|
||
void TitleBar::onRcLink(bool ok)
|
||
{
|
||
if (ok) {
|
||
m_rc->setText("遥控器正常");
|
||
m_rc->setState(LedIndicator::Green);
|
||
} else {
|
||
m_rc->setText("遥控器断开");
|
||
m_rc->setState(LedIndicator::RedBlink);
|
||
m_rcBat->setText("--%");
|
||
}
|
||
}
|
||
|
||
void TitleBar::onRcFrame(const RcFrame& f)
|
||
{
|
||
m_rcBat->setText(QString("%1%").arg(f.battery));
|
||
}
|