#pragma once #include #include #include #include #include #include // 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; };