#include "hmibutton.h" #include #include #include #include // 构造函数:初始化按钮控件 HmiButton::HmiButton(QGraphicsItem* parent) : HmiControlItem(parent) { } // 返回按钮的边界矩形 QRectF HmiButton::boundingRect() const { return QRectF(0, 0, 80, 40).adjusted(-1, -1, 1, 1); } // 绘制按钮(根据状态设置不同颜色与文本) void HmiButton::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->setRenderHint(QPainter::Antialiasing); painter->setPen(Qt::black); painter->setBrush(m_isButtonOn ? m_buttonOnColor : m_buttonOffColor); painter->drawRect(0, 0, 80, 40); painter->drawText(QRectF(0, 0, 80, 40), Qt::AlignCenter, m_isButtonOn ? "ON" : "OFF"); if (isSelected()) { painter->setPen(QPen(Qt::black, 1, Qt::DashLine)); painter->setBrush(Qt::NoBrush); painter->drawRect(boundingRect().adjusted(1, 1, -1, -1)); } } // 右键菜单 void HmiButton::createContextMenu(QMenu& menu) { HmiControlItem::createContextMenu(menu); QAction* deleteAction = new QAction("删除", &menu); QObject::connect(deleteAction, &QAction::triggered, [this]() { deleteItem(); }); QAction* copyAction = new QAction("复制", &menu); QObject::connect(copyAction, &QAction::triggered, [this]() { copyToClipboard(saveToClipboard()); }); QAction* setOnAction = new QAction("置ON", &menu); QObject::connect(setOnAction, &QAction::triggered, [this]() { setButtonState(true); }); QAction* setOffAction = new QAction("置OFF", &menu); QObject::connect(setOffAction, &QAction::triggered, [this]() { setButtonState(false); }); QMenu* appearanceMenu = menu.addMenu("更改外观"); QAction* changeOnAppearance = new QAction("设置ON状态颜色", appearanceMenu); QObject::connect(changeOnAppearance, &QAction::triggered, [this]() { changeAppearanceColor(true, m_buttonOnColor, m_buttonOffColor); }); QAction* changeOffAppearance = new QAction("设置OFF状态颜色", appearanceMenu); QObject::connect(changeOffAppearance, &QAction::triggered, [this]() { changeAppearanceColor(false, m_buttonOnColor, m_buttonOffColor); }); menu.addAction(copyAction); menu.addSeparator(); menu.addAction(setOnAction); menu.addAction(setOffAction); menu.addMenu(appearanceMenu); appearanceMenu->addAction(changeOnAppearance); appearanceMenu->addAction(changeOffAppearance); menu.addSeparator(); menu.addAction(deleteAction); } // 保存按钮数据 QVariantMap HmiButton::saveToClipboard() const { QVariantMap data = HmiControlItem::saveToClipboard(); data["isButtonOn"] = m_isButtonOn; data["onColor"] = m_buttonOnColor.name(); data["offColor"] = m_buttonOffColor.name(); return data; } // 设置按钮状态并触发重绘(仅在变化时发出信号,避免读回写环路) void HmiButton::setButtonState(bool on) { if (m_isButtonOn == on) { update(); return; } m_isButtonOn = on; update(); emit stateChanged(m_isButtonOn); } \