|
- #include "hmibutton.h"
- #include <QPainter>
- #include <QMenu>
- #include <QAction>
- #include <QGraphicsScene>
-
- // 构造函数:初始化按钮控件
- 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);
- }
-
- \
|