Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

93 rindas
2.3 KiB

  1. #ifndef DOCUMENT_H
  2. #define DOCUMENT_H
  3. #include <QWidget>
  4. #include <QGraphicsScene>
  5. #include <QGraphicsView>
  6. #include <QList>
  7. #include <QByteArray>
  8. #include <QPointF>
  9. // 前向声明
  10. class ResizableRectangle;
  11. class ResizableEllipse;
  12. class NamedItem;
  13. // 文档基类
  14. class BaseDocument : public QWidget
  15. {
  16. Q_OBJECT
  17. public:
  18. enum DocumentType { HMI, PLC };
  19. BaseDocument(DocumentType type, QWidget *parent = nullptr)
  20. : QWidget(parent), m_type(type) {}
  21. virtual ~BaseDocument() = default;
  22. DocumentType type() const { return m_type; }
  23. virtual QString title() const = 0;
  24. protected:
  25. DocumentType m_type;
  26. };
  27. // HMI文档类(包含绘图相关核心功能)
  28. class HMIDocument : public BaseDocument
  29. {
  30. Q_OBJECT
  31. public:
  32. HMIDocument(QWidget *parent = nullptr);
  33. ~HMIDocument() override;
  34. QString title() const override { return m_title; }
  35. void setTitle(const QString &title) { m_title = title; }
  36. QGraphicsView *view() const { return m_view; }
  37. QGraphicsScene *scene() const { return m_scene; }
  38. // 绘图控制
  39. void setDrawEllipse(bool enable) { m_canDrawEllipse = enable; }
  40. void setDrawRectangle(bool enable) { m_canDrawRectangle = enable; }
  41. // 编辑功能
  42. void copySelectedItems();
  43. void pasteItems();
  44. void deleteSelectedItems();
  45. void showItemProperties();
  46. signals:
  47. void titleChanged(const QString &title);
  48. protected:
  49. bool eventFilter(QObject *obj, QEvent *event) override;
  50. private:
  51. // 绘图相关
  52. void createEllipse(const QPointF &pos);
  53. void createRectangle(const QPointF &pos);
  54. void resetDrawFlags();
  55. void showContextMenu(QPoint globalPos);
  56. // 图形项序列化/反序列化
  57. QByteArray serializeItem(QGraphicsItem *item);
  58. QGraphicsItem *deserializeItem(const QByteArray &data);
  59. QString m_title;
  60. QGraphicsScene *m_scene;
  61. QGraphicsView *m_view;
  62. bool m_canDrawEllipse;
  63. bool m_canDrawRectangle;
  64. // 复制粘贴相关
  65. QList<QByteArray> m_copiedItemsData;
  66. QPointF m_lastPastePos;
  67. };
  68. // PLC文档类(预留,暂为空实现)
  69. class PLCDocument : public BaseDocument
  70. {
  71. Q_OBJECT
  72. public:
  73. PLCDocument(QWidget *parent = nullptr) : BaseDocument(PLC, parent) {}
  74. QString title() const override { return "PLC文档"; }
  75. };
  76. #endif // DOCUMENT_H