first commit

This commit is contained in:
2026-01-02 19:20:35 +09:00
commit a10cb30c4a
94 changed files with 28609 additions and 0 deletions

View File

@@ -0,0 +1,252 @@
#include "channelstatuswidget.h"
#include <QPainter>
#include <QPaintEvent>
#include <QFont>
#include <QDebug>
// =====================================================
// ChannelStatusWidget 实现
// =====================================================
ChannelStatusWidget::ChannelStatusWidget(ChannelManager::ChannelId channelId,
const QString &channelName,
QWidget *parent,
ChannelStatusWidget::DisplayMode mode)
: QWidget(parent), m_channelId(channelId), m_channelName(channelName), m_currentOperation(ChannelManager::NONE), m_channelManager(ChannelManager::instance()), m_displayMode(mode)
{
setFixedSize(140, 80); // 紧凑尺寸适配launcher布局
setStyleSheet("background-color: #34495e; border: 2px solid #2c3e50; "
"border-radius: 8px;");
}
void ChannelStatusWidget::updateStatus(ChannelManager::OperationType operation,
const QString &description)
{
m_currentOperation = operation;
m_description = description;
update(); // 触发重绘
}
void ChannelStatusWidget::setDisplayMode(ChannelStatusWidget::DisplayMode mode)
{
m_displayMode = mode;
update(); // 触发重绘
}
void ChannelStatusWidget::paintEvent(QPaintEvent *event)
{
QWidget::paintEvent(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QRect rect = this->rect().adjusted(6, 6, -6, -6);
// 绘制通道连接器
drawChannelConnector(painter, rect);
// 绘制通道名称
if (m_displayMode == ChannelStatusWidget::DETAILED_MODE)
{
// 详细模式:通道名称在顶部
painter.setPen(QColor("#ecf0f1"));
QFont nameFont("Microsoft YaHei", 9, QFont::Bold);
painter.setFont(nameFont);
painter.drawText(rect.adjusted(0, 0, 0, -50), Qt::AlignCenter, m_channelName);
// 绘制状态文本
QString statusText = m_channelManager->getOperationDisplayName(m_currentOperation);
if (!m_description.isEmpty() && m_description.length() < 15)
{
statusText += "\n" + m_description;
}
QFont statusFont("Microsoft YaHei", 8);
painter.setFont(statusFont);
painter.drawText(rect.adjusted(0, 28, 0, 0), Qt::AlignCenter, statusText);
// 绘制接线信息
ChannelManager::ChannelCapability capability =
m_channelManager->getChannelCapability(m_channelId);
QString wiringText = capability.wireColors.join("-");
painter.setPen(QColor("#bdc3c7"));
QFont wiringFont("Microsoft YaHei", 7);
painter.setFont(wiringFont);
painter.drawText(rect.adjusted(0, 50, 0, 0), Qt::AlignCenter, wiringText);
}
else
{
// 概览模式:通道名称在整个区域居中显示
painter.setPen(QColor("#ffffff"));
QFont overviewFont("Microsoft YaHei", 10, QFont::Bold);
painter.setFont(overviewFont);
painter.drawText(rect.adjusted(0, 25, 0, 0), Qt::AlignHCenter | Qt::AlignTop, m_channelName);
}
}
void ChannelStatusWidget::drawChannelConnector(QPainter &painter, const QRect &rect)
{
// 绘制通道连接器图形,颜色根据状态变化
QRect connectorRect(rect.center().x() - 25, rect.top() + 5, 50, 20);
// 根据状态设置连接器颜色
QColor connectorColor = getStatusColor();
painter.setBrush(connectorColor);
painter.setPen(QPen(connectorColor.darker(120), 1));
painter.drawRoundedRect(connectorRect, 4, 4);
// 绘制接线端子
ChannelManager::ChannelCapability capability =
m_channelManager->getChannelCapability(m_channelId);
int wireCount = capability.wireColors.size();
int wireSpacing = connectorRect.width() / (wireCount + 1);
for (int i = 0; i < wireCount; ++i)
{
QRect wireRect(connectorRect.left() + wireSpacing * (i + 1) - 2,
connectorRect.bottom() - 3, 4, 6);
// 根据线色设置颜色
QColor wireColor;
QString colorName = capability.wireColors[i];
if (colorName == "")
wireColor = QColor("#f8f9fa");
else if (colorName == "")
wireColor = QColor("#e74c3c");
else if (colorName == "")
wireColor = QColor("#95a5a6");
else if (colorName == "")
wireColor = QColor("#1a1a1a");
else
wireColor = QColor("#bdc3c7");
painter.setBrush(wireColor);
painter.setPen(QPen(QColor("#34495e"), 1));
painter.drawRect(wireRect);
}
}
QColor ChannelStatusWidget::getStatusColor() const
{
switch (m_currentOperation)
{
case ChannelManager::NONE:
return QColor("#27ae60"); // 绿色 - 空闲
// 输入通道测量操作 - 蓝色系
case ChannelManager::VOLTAGE_MEASUREMENT:
case ChannelManager::MV_MEASUREMENT:
case ChannelManager::MA_MEASUREMENT:
case ChannelManager::AC_MEASUREMENT:
case ChannelManager::RESISTANCE_MEASUREMENT:
case ChannelManager::FREQUENCY_MEASUREMENT:
case ChannelManager::SWITCH_MEASUREMENT:
case ChannelManager::INSULATION_MEASUREMENT:
return QColor("#3498db"); // 蓝色 - 测量中
// 输出通道操作 - 橙色系
case ChannelManager::VOLTAGE_OUTPUT:
case ChannelManager::MV_OUTPUT:
case ChannelManager::MA_OUTPUT:
case ChannelManager::RESISTANCE_SIMULATION:
return QColor("#f39c12"); // 橙色 - 输出中
// 波形输出 - 紫色
case ChannelManager::WAVEFORM_OUTPUT:
return QColor("#9b59b6"); // 紫色 - 波形输出中
default:
return QColor("#95a5a6"); // 灰色 - 未知
}
}
// =====================================================
// ChannelStatusPanel 实现
// =====================================================
ChannelStatusPanel::ChannelStatusPanel(QWidget *parent,
LayoutOrientation orientation)
: QWidget(parent), m_channelManager(ChannelManager::instance()), m_displayMode(ChannelStatusWidget::OVERVIEW_MODE)
{
setupUI(orientation);
// 连接 ChannelManager 的信号
connect(m_channelManager, &ChannelManager::channelStatusChanged,
this, &ChannelStatusPanel::onChannelStatusChanged);
}
void ChannelStatusPanel::setupUI(LayoutOrientation orientation)
{
QBoxLayout *layout;
if (orientation == HORIZONTAL)
{
layout = new QHBoxLayout(this);
}
else
{
layout = new QVBoxLayout(this);
}
layout->setContentsMargins(4, 4, 4, 4);
layout->setSpacing(8);
// 创建四个通道的状态显示
struct ChannelInfo
{
ChannelManager::ChannelId id;
QString name;
};
QList<ChannelInfo> channels = {
{ChannelManager::INPUT_CHANNEL_1, "输入通道1"},
{ChannelManager::INPUT_CHANNEL_2, "输入通道2"},
{ChannelManager::OUTPUT_CHANNEL_1, "输出通道1"},
{ChannelManager::OUTPUT_CHANNEL_2, "输出通道2"}};
for (const auto &channel : channels)
{
ChannelStatusWidget *widget = new ChannelStatusWidget(
channel.id, channel.name, this, m_displayMode);
m_channelWidgets[channel.id] = widget;
layout->addWidget(widget);
}
layout->addStretch();
}
void ChannelStatusPanel::setDisplayMode(ChannelStatusWidget::DisplayMode mode)
{
m_displayMode = mode;
for (auto widget : m_channelWidgets)
{
widget->setDisplayMode(mode);
}
}
void ChannelStatusPanel::refresh()
{
for (auto it = m_channelWidgets.constBegin();
it != m_channelWidgets.constEnd(); ++it)
{
ChannelManager::ChannelId channelId = it.key();
ChannelStatusWidget *widget = it.value();
ChannelManager::OperationType operation =
m_channelManager->getChannelOperation(channelId);
QString description =
m_channelManager->getChannelDescription(channelId);
widget->updateStatus(operation, description);
}
}
void ChannelStatusPanel::onChannelStatusChanged(
ChannelManager::ChannelId channel,
ChannelManager::OperationType operation,
const QString &description)
{
if (m_channelWidgets.contains(channel))
{
m_channelWidgets[channel]->updateStatus(operation, description);
}
}