#ifndef DOCUMENT_H #define DOCUMENT_H #include #include #include #include #include #include // 前向声明 class ResizableRectangle; class ResizableEllipse; class NamedItem; // 文档基类 class BaseDocument : public QWidget { Q_OBJECT public: enum DocumentType { HMI, PLC }; BaseDocument(DocumentType type, QWidget *parent = nullptr) : QWidget(parent), m_type(type) {} virtual ~BaseDocument() = default; DocumentType type() const { return m_type; } virtual QString title() const = 0; protected: DocumentType m_type; }; // HMI文档类(包含绘图相关核心功能) class HMIDocument : public BaseDocument { Q_OBJECT public: HMIDocument(QWidget *parent = nullptr); ~HMIDocument() override; QString title() const override { return m_title; } void setTitle(const QString &title) { m_title = title; } QGraphicsView *view() const { return m_view; } QGraphicsScene *scene() const { return m_scene; } // 绘图控制 void setDrawEllipse(bool enable) { m_canDrawEllipse = enable; } void setDrawRectangle(bool enable) { m_canDrawRectangle = enable; } // 编辑功能 void copySelectedItems(); void pasteItems(); void deleteSelectedItems(); void showItemProperties(); signals: void titleChanged(const QString &title); protected: bool eventFilter(QObject *obj, QEvent *event) override; private: // 绘图相关 void createEllipse(const QPointF &pos); void createRectangle(const QPointF &pos); void resetDrawFlags(); void showContextMenu(QPoint globalPos); // 图形项序列化/反序列化 QByteArray serializeItem(QGraphicsItem *item); QGraphicsItem *deserializeItem(const QByteArray &data); QString m_title; QGraphicsScene *m_scene; QGraphicsView *m_view; bool m_canDrawEllipse; bool m_canDrawRectangle; // 复制粘贴相关 QList m_copiedItemsData; QPointF m_lastPastePos; }; // PLC文档类(预留,暂为空实现) class PLCDocument : public BaseDocument { Q_OBJECT public: PLCDocument(QWidget *parent = nullptr) : BaseDocument(PLC, parent) {} QString title() const override { return "PLC文档"; } }; #endif // DOCUMENT_H