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

85 行
3.1 KiB

  1. #include "hmiled.h"
  2. #include <QPainter>
  3. #include <QMenu>
  4. #include <QAction>
  5. #include <QGraphicsScene>
  6. // 构造函数:初始化指示灯控件
  7. HmiLed::HmiLed(QGraphicsItem* parent)
  8. : HmiControlItem(parent) {
  9. }
  10. // 返回指示灯的边界矩形
  11. QRectF HmiLed::boundingRect() const {
  12. return QRectF(0, 0, 60, 60).adjusted(-1, -1, 1, 1);
  13. }
  14. // 绘制指示灯:根据状态绘制圆形,使用ON或OFF状态颜色
  15. void HmiLed::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_isLedOn ? m_ledOnColor : m_ledOffColor); // 根据状态设置填充颜色
  22. qreal size = qMin(boundingRect().width(), boundingRect().height());
  23. painter->drawEllipse(0, 0, size - 2, size - 2); // 绘制圆形
  24. painter->drawText(QRectF(0, 0, size - 2, size - 2), Qt::AlignCenter, ""); // 空文本(占位)
  25. if (isSelected()) {
  26. // 选中时绘制虚线边框
  27. painter->setPen(QPen(Qt::black, 1, Qt::DashLine));
  28. painter->setBrush(Qt::NoBrush);
  29. painter->drawRect(boundingRect().adjusted(1, 1, -1, -1));
  30. }
  31. }
  32. // 创建指示灯的右键菜单
  33. void HmiLed::createContextMenu(QMenu& menu) {
  34. // 调用基类的右键菜单,添加寄存器绑定选项
  35. HmiControlItem::createContextMenu(menu);
  36. // 删除选项
  37. QAction* deleteAction = new QAction("删除", &menu);
  38. QObject::connect(deleteAction, &QAction::triggered, [this]() { deleteItem(); });
  39. // 复制选项
  40. QAction* copyAction = new QAction("复制", &menu);
  41. QObject::connect(copyAction, &QAction::triggered, [this]() {
  42. copyToClipboard(saveToClipboard());
  43. });
  44. // 更改外观子菜单
  45. QMenu* appearanceMenu = menu.addMenu("更改外观");
  46. QAction* changeOnAppearance = new QAction("设置ON状态颜色", appearanceMenu);
  47. QObject::connect(changeOnAppearance, &QAction::triggered,
  48. [this]() { changeAppearanceColor(true, m_ledOnColor, m_ledOffColor); });
  49. QAction* changeOffAppearance = new QAction("设置OFF状态颜色", appearanceMenu);
  50. QObject::connect(changeOffAppearance, &QAction::triggered,
  51. [this]() { changeAppearanceColor(false, m_ledOnColor, m_ledOffColor); });
  52. // 添加菜单项
  53. menu.addAction(copyAction);
  54. menu.addSeparator();
  55. menu.addMenu(appearanceMenu);
  56. appearanceMenu->addAction(changeOnAppearance);
  57. appearanceMenu->addAction(changeOffAppearance);
  58. menu.addSeparator();
  59. menu.addAction(deleteAction);
  60. }
  61. // 保存指示灯数据到剪贴板
  62. QVariantMap HmiLed::saveToClipboard() const {
  63. QVariantMap data = HmiControlItem::saveToClipboard();
  64. data["isLedOn"] = m_isLedOn;
  65. data["onColor"] = m_ledOnColor.name();
  66. data["offColor"] = m_ledOffColor.name();
  67. return data;
  68. }
  69. // 设置指示灯状态并触发重绘
  70. void HmiLed::setLedState(bool on) {
  71. m_isLedOn = on;
  72. update();
  73. }