No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 

94 líneas
4.2 KiB

  1. #pragma once
  2. #include <QGraphicsItem>
  3. #include <QGraphicsSceneMouseEvent>
  4. #include <QGraphicsSceneHoverEvent>
  5. #include <QGraphicsSceneContextMenuEvent>
  6. #include <QColor>
  7. #include <QVariantMap>
  8. // HMI控件抽象基类,定义所有控件的通用接口和行为
  9. class HmiControlItem : public QObject, public QGraphicsItem {
  10. Q_OBJECT
  11. Q_INTERFACES(QGraphicsItem) // 添加此行以支持 QGraphicsItem 接口
  12. public:
  13. // 构造函数,初始化控件基本属性(如可移动、可选择、接受鼠标悬停等)
  14. explicit HmiControlItem(QGraphicsItem* parent = nullptr);
  15. // 返回控件的边界矩形(纯虚函数,子类必须实现以定义控件的绘制区域)
  16. virtual QRectF boundingRect() const override = 0;
  17. // 绘制控件(纯虚函数,子类实现具体的绘制逻辑,如按钮或指示灯的外观)
  18. virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override = 0;
  19. // 获取控件类型(用于剪贴板,子类返回特定类型,如“按钮”或“指示灯”)
  20. virtual QString getItemType() const = 0;
  21. // 存储控件数据到剪贴板(虚函数,子类实现,保存位置、缩放、状态等)
  22. virtual QVariantMap saveToClipboard() const;
  23. // 从剪贴板数据创建控件,允许指定粘贴位置
  24. // 参数:data(剪贴板数据),pos(粘贴位置),parent(父项)
  25. static HmiControlItem* createFromClipboard(const QVariantMap& data, const QPointF& pos, QGraphicsItem* parent = nullptr);
  26. // 删除控件,从场景中移除并释放内存
  27. void deleteItem();
  28. // 静态剪贴板操作
  29. // 存储控件数据到静态剪贴板
  30. static void copyToClipboard(const QVariantMap& data);
  31. // 获取当前剪贴板数据
  32. static QVariantMap getClipboardData();
  33. // 检查剪贴板是否有有效数据
  34. static bool hasClipboardData();
  35. // 设置寄存器绑定
  36. bool setRegisterBinding(int address);
  37. // 获取寄存器地址
  38. int getRegisterAddress() const { return m_registerAddress; }
  39. protected:
  40. // 获取子类的宽高比(用于缩放时保持比例,默认为2.0)
  41. virtual qreal getAspectRatio() const { return m_aspectRatio; }
  42. // 鼠标事件处理
  43. // 处理鼠标按下事件(如开始拖动或缩放)
  44. void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
  45. // 处理鼠标移动事件(如拖动控件或调整大小)
  46. void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
  47. // 处理鼠标释放事件(结束拖动或缩放)
  48. void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
  49. // 处理鼠标悬停事件(设置光标样式,如缩放或拖动光标)
  50. void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override;
  51. // 处理右键菜单事件(显示控件特定的上下文菜单)
  52. void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override;
  53. // 检查鼠标是否在右下角缩放区域(用于判断是否进入缩放模式)
  54. virtual bool isInScaleArea(const QPointF& pos);
  55. // 创建右键菜单(虚函数,子类实现特定菜单项,如复制、删除等)
  56. virtual void createContextMenu(QMenu& menu);
  57. // 更改控件外观颜色(通过颜色对话框选择ON或OFF状态颜色)
  58. void changeAppearanceColor(bool isOnState, QColor& onColor, QColor& offColor);
  59. // 缩放相关成员
  60. bool m_isScaling = false; // 是否处于缩放模式
  61. QRectF m_originalRect; // 缩放开始时的原始边界矩形
  62. QPointF m_scaleStartPos; // 缩放开始时的鼠标位置
  63. QPointF m_dragStartPos; // 拖动开始时的鼠标位置
  64. const qreal m_aspectRatio = 2.0; // 默认宽高比
  65. const qreal m_scaleAreaSize = 15.0; // 右下角缩放区域大小
  66. const qreal m_minWidth = 60.0; // 最小宽度
  67. const qreal m_maxWidth = 320.0; // 最大宽度
  68. const qreal m_minHeight = 30.0; // 最小高度
  69. const qreal m_maxHeight = 160.0; // 最大高度
  70. // 寄存器绑定成员
  71. int m_registerAddress; // 寄存器地址(0-4000)
  72. private:
  73. // 静态剪贴板数据,存储单个控件的属性(共享于所有控件实例)
  74. static QVariantMap m_clipboardData;
  75. };