您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

90 行
3.1 KiB

  1. #include "hmibutton.h"
  2. #include <QPainter>
  3. #include <QMenu>
  4. #include <QAction>
  5. #include <QGraphicsScene>
  6. // 构造函数:初始化按钮控件
  7. HmiButton::HmiButton(QGraphicsItem* parent)
  8. : HmiControlItem(parent) {
  9. }
  10. // 返回按钮的边界矩形
  11. QRectF HmiButton::boundingRect() const {
  12. return QRectF(0, 0, 80, 40).adjusted(-1, -1, 1, 1);
  13. }
  14. // 绘制按钮(根据状态设置不同颜色与文本)
  15. void HmiButton::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
  16. {
  17. Q_UNUSED(option);
  18. Q_UNUSED(widget);
  19. painter->setRenderHint(QPainter::Antialiasing);
  20. painter->setPen(Qt::black);
  21. painter->setBrush(m_isButtonOn ? m_buttonOnColor : m_buttonOffColor);
  22. painter->drawRect(0, 0, 80, 40);
  23. painter->drawText(QRectF(0, 0, 80, 40), Qt::AlignCenter, m_isButtonOn ? "ON" : "OFF");
  24. if (isSelected()) {
  25. painter->setPen(QPen(Qt::black, 1, Qt::DashLine));
  26. painter->setBrush(Qt::NoBrush);
  27. painter->drawRect(boundingRect().adjusted(1, 1, -1, -1));
  28. }
  29. }
  30. // 右键菜单
  31. void HmiButton::createContextMenu(QMenu& menu) {
  32. HmiControlItem::createContextMenu(menu);
  33. QAction* deleteAction = new QAction("删除", &menu);
  34. QObject::connect(deleteAction, &QAction::triggered, [this]() { deleteItem(); });
  35. QAction* copyAction = new QAction("复制", &menu);
  36. QObject::connect(copyAction, &QAction::triggered, [this]() {
  37. copyToClipboard(saveToClipboard());
  38. });
  39. QAction* setOnAction = new QAction("置ON", &menu);
  40. QObject::connect(setOnAction, &QAction::triggered, [this]() { setButtonState(true); });
  41. QAction* setOffAction = new QAction("置OFF", &menu);
  42. QObject::connect(setOffAction, &QAction::triggered, [this]() { setButtonState(false); });
  43. QMenu* appearanceMenu = menu.addMenu("更改外观");
  44. QAction* changeOnAppearance = new QAction("设置ON状态颜色", appearanceMenu);
  45. QObject::connect(changeOnAppearance, &QAction::triggered,
  46. [this]() { changeAppearanceColor(true, m_buttonOnColor, m_buttonOffColor); });
  47. QAction* changeOffAppearance = new QAction("设置OFF状态颜色", appearanceMenu);
  48. QObject::connect(changeOffAppearance, &QAction::triggered,
  49. [this]() { changeAppearanceColor(false, m_buttonOnColor, m_buttonOffColor); });
  50. menu.addAction(copyAction);
  51. menu.addSeparator();
  52. menu.addAction(setOnAction);
  53. menu.addAction(setOffAction);
  54. menu.addMenu(appearanceMenu);
  55. appearanceMenu->addAction(changeOnAppearance);
  56. appearanceMenu->addAction(changeOffAppearance);
  57. menu.addSeparator();
  58. menu.addAction(deleteAction);
  59. }
  60. // 保存按钮数据
  61. QVariantMap HmiButton::saveToClipboard() const {
  62. QVariantMap data = HmiControlItem::saveToClipboard();
  63. data["isButtonOn"] = m_isButtonOn;
  64. data["onColor"] = m_buttonOnColor.name();
  65. data["offColor"] = m_buttonOffColor.name();
  66. return data;
  67. }
  68. // 设置按钮状态并触发重绘(仅在变化时发出信号,避免读回写环路)
  69. void HmiButton::setButtonState(bool on) {
  70. if (m_isButtonOn == on) { update(); return; }
  71. m_isButtonOn = on;
  72. update();
  73. emit stateChanged(m_isButtonOn);
  74. }
  75. \