综合平台编程器项目的远程存储
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

154 řádky
5.0 KiB

  1. /**
  2. * @file main_window.h
  3. * @brief 定义综合平台编程器主窗口及运行模式界面协调逻辑
  4. * @version 0.2.0
  5. * @author suyu
  6. * @date 2026-08-08
  7. */
  8. #pragma once
  9. #include "domain/hmi_model.h"
  10. #include "domain/runtime_state.h"
  11. #include <QMainWindow>
  12. #include <memory>
  13. QT_BEGIN_NAMESPACE
  14. class QActionGroup;
  15. class QAction;
  16. class QComboBox;
  17. class QLabel;
  18. class QLineEdit;
  19. class QPushButton;
  20. class QSpinBox;
  21. class QTimer;
  22. class QToolBar;
  23. namespace Ui {
  24. class MainWindow;
  25. }
  26. QT_END_NAMESPACE
  27. class RuntimeModeService;
  28. class ProjectService;
  29. class HmiEditorService;
  30. class HmiRuntimeService;
  31. class HmiEditorWidget;
  32. /**
  33. * @brief 组织主界面区域并将用户操作转交给服务层
  34. *
  35. * 主窗口不直接访问寄存器、工程文件或 PLC 通信实现
  36. */
  37. class MainWindow final : public QMainWindow
  38. {
  39. Q_OBJECT
  40. public:
  41. /**
  42. * @brief 创建主窗口并注入 UI 所需的应用服务
  43. * @param runtime_mode_service 运行模式服务,调用方必须保证其生命周期覆盖窗口
  44. * @param project_service 工程管理服务,调用方必须保证其生命周期覆盖窗口
  45. * @param hmi_editor_service HMI 编辑服务,调用方必须保证其生命周期覆盖窗口
  46. * @param hmi_runtime_service HMI 运行服务,调用方必须保证其生命周期覆盖窗口
  47. * @param parent Qt 父对象
  48. */
  49. explicit MainWindow(
  50. RuntimeModeService &runtime_mode_service,
  51. ProjectService &project_service,
  52. HmiEditorService &hmi_editor_service,
  53. HmiRuntimeService &hmi_runtime_service,
  54. QWidget *parent = nullptr);
  55. ~MainWindow() override;
  56. private:
  57. // 配置菜单和工具栏动作
  58. void configureActions();
  59. // 配置主窗口外观和状态栏
  60. void configureAppearance();
  61. // 创建并连接 HMI 编辑画布
  62. void configureHmiEditor();
  63. // 创建并连接控件属性编辑表单
  64. void configurePropertyEditor();
  65. // 刷新工程树和当前 HMI 页面信息
  66. void refreshProjectUi();
  67. // 显示指定 HMI 控件的可编辑属性
  68. void showControlProperties(const std::string &control_id);
  69. // 向当前页面添加指定类型的 HMI 控件
  70. void addHmiControl(HmiControlType type);
  71. // 删除当前选中的 HMI 控件
  72. void deleteSelectedControl();
  73. // 将属性表单内容应用到当前选中控件
  74. void applySelectedControlProperties();
  75. // 创建新的工程并刷新编辑界面
  76. void createNewProject();
  77. // 保存当前工程到已关联的路径
  78. void saveProject();
  79. // 将当前工程保存到用户指定的路径
  80. void saveProjectAs();
  81. // 从用户指定的路径加载工程
  82. void loadProject();
  83. // 在状态栏和输出面板显示工程操作结果
  84. void showProjectResult(const QString &action, const QString &message, bool succeeded);
  85. /**
  86. * @brief 请求服务层切换模式并同步界面状态
  87. * @param requested_mode 目标应用模式
  88. *
  89. * 失败时恢复与服务层当前状态一致的工具栏选项
  90. */
  91. void requestMode(ApplicationMode requested_mode);
  92. /**
  93. * @brief 根据服务层模式策略更新编辑权限和状态反馈
  94. * @param message 要显示在状态栏和输出区的模式结果消息
  95. */
  96. void updateModeUi(const QString &message);
  97. /**
  98. * @brief 将互斥模式动作同步到服务层当前状态
  99. */
  100. void restoreCurrentModeAction();
  101. std::unique_ptr<Ui::MainWindow> ui_;
  102. /**
  103. * @brief 非拥有的运行模式服务依赖,由应用入口保证生命周期
  104. */
  105. RuntimeModeService &runtime_mode_service_;
  106. /**
  107. * @brief 非拥有的工程和 HMI 服务依赖,由应用入口保证生命周期
  108. */
  109. ProjectService &project_service_;
  110. HmiEditorService &hmi_editor_service_;
  111. HmiRuntimeService &hmi_runtime_service_;
  112. QActionGroup *mode_action_group_ = nullptr;
  113. QAction *new_project_action_ = nullptr;
  114. QAction *save_project_action_ = nullptr;
  115. QAction *save_as_project_action_ = nullptr;
  116. QAction *load_project_action_ = nullptr;
  117. QAction *add_button_action_ = nullptr;
  118. QAction *add_indicator_action_ = nullptr;
  119. QAction *add_numeric_display_action_ = nullptr;
  120. QAction *add_numeric_input_action_ = nullptr;
  121. QAction *delete_control_action_ = nullptr;
  122. QToolBar *hmi_tool_bar_ = nullptr;
  123. HmiEditorWidget *hmi_editor_widget_ = nullptr;
  124. QTimer *runtime_refresh_timer_ = nullptr;
  125. QLabel *mode_status_label_ = nullptr;
  126. QLabel *register_status_label_ = nullptr;
  127. QLabel *executor_status_label_ = nullptr;
  128. QLineEdit *control_id_edit_ = nullptr;
  129. QLineEdit *control_text_edit_ = nullptr;
  130. QSpinBox *control_x_spin_box_ = nullptr;
  131. QSpinBox *control_y_spin_box_ = nullptr;
  132. QSpinBox *control_width_spin_box_ = nullptr;
  133. QSpinBox *control_height_spin_box_ = nullptr;
  134. QComboBox *binding_area_combo_box_ = nullptr;
  135. QSpinBox *binding_index_spin_box_ = nullptr;
  136. QPushButton *apply_properties_button_ = nullptr;
  137. std::string selected_control_id_;
  138. };