|
- #pragma once
- #include <QGraphicsItem>
- #include <QGraphicsSceneMouseEvent>
- #include <QGraphicsSceneHoverEvent>
- #include <QGraphicsSceneContextMenuEvent>
- #include <QColor>
- #include <QVariantMap>
-
- // HMI控件抽象基类,定义所有控件的通用接口和行为
- class HmiControlItem : public QObject, public QGraphicsItem {
- Q_OBJECT
- Q_INTERFACES(QGraphicsItem) // 添加此行以支持 QGraphicsItem 接口
- public:
- // 构造函数,初始化控件基本属性(如可移动、可选择、接受鼠标悬停等)
- explicit HmiControlItem(QGraphicsItem* parent = nullptr);
-
- // 返回控件的边界矩形(纯虚函数,子类必须实现以定义控件的绘制区域)
- virtual QRectF boundingRect() const override = 0;
-
- // 绘制控件(纯虚函数,子类实现具体的绘制逻辑,如按钮或指示灯的外观)
- virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override = 0;
-
- // 获取控件类型(用于剪贴板,子类返回特定类型,如“按钮”或“指示灯”)
- virtual QString getItemType() const = 0;
-
- // 存储控件数据到剪贴板(虚函数,子类实现,保存位置、缩放、状态等)
- virtual QVariantMap saveToClipboard() const;
-
- // 从剪贴板数据创建控件,允许指定粘贴位置
- // 参数:data(剪贴板数据),pos(粘贴位置),parent(父项)
- static HmiControlItem* createFromClipboard(const QVariantMap& data, const QPointF& pos, QGraphicsItem* parent = nullptr);
-
- // 删除控件,从场景中移除并释放内存
- void deleteItem();
-
- // 静态剪贴板操作
- // 存储控件数据到静态剪贴板
- static void copyToClipboard(const QVariantMap& data);
- // 获取当前剪贴板数据
- static QVariantMap getClipboardData();
- // 检查剪贴板是否有有效数据
- static bool hasClipboardData();
-
- // 设置寄存器绑定
- bool setRegisterBinding(int address);
-
- // 获取寄存器地址
- int getRegisterAddress() const { return m_registerAddress; }
-
- protected:
- // 获取子类的宽高比(用于缩放时保持比例,默认为2.0)
- virtual qreal getAspectRatio() const { return m_aspectRatio; }
-
- // 鼠标事件处理
- // 处理鼠标按下事件(如开始拖动或缩放)
- void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
- // 处理鼠标移动事件(如拖动控件或调整大小)
- void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
- // 处理鼠标释放事件(结束拖动或缩放)
- void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
- // 处理鼠标悬停事件(设置光标样式,如缩放或拖动光标)
- void hoverMoveEvent(QGraphicsSceneHoverEvent* event) override;
- // 处理右键菜单事件(显示控件特定的上下文菜单)
- void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override;
-
- // 检查鼠标是否在右下角缩放区域(用于判断是否进入缩放模式)
- virtual bool isInScaleArea(const QPointF& pos);
-
- // 创建右键菜单(虚函数,子类实现特定菜单项,如复制、删除等)
- virtual void createContextMenu(QMenu& menu);
-
- // 更改控件外观颜色(通过颜色对话框选择ON或OFF状态颜色)
- void changeAppearanceColor(bool isOnState, QColor& onColor, QColor& offColor);
-
- // 缩放相关成员
- bool m_isScaling = false; // 是否处于缩放模式
- QRectF m_originalRect; // 缩放开始时的原始边界矩形
- QPointF m_scaleStartPos; // 缩放开始时的鼠标位置
- QPointF m_dragStartPos; // 拖动开始时的鼠标位置
- const qreal m_aspectRatio = 2.0; // 默认宽高比
- const qreal m_scaleAreaSize = 15.0; // 右下角缩放区域大小
- const qreal m_minWidth = 60.0; // 最小宽度
- const qreal m_maxWidth = 320.0; // 最大宽度
- const qreal m_minHeight = 30.0; // 最小高度
- const qreal m_maxHeight = 160.0; // 最大高度
-
- // 寄存器绑定成员
- int m_registerAddress; // 寄存器地址(0-4000)
-
- private:
- // 静态剪贴板数据,存储单个控件的属性(共享于所有控件实例)
- static QVariantMap m_clipboardData;
- };
|