综合平台编辑器
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ů.

236 řádky
7.9 KiB

  1. #include "hmimodule.h"
  2. #include <QGraphicsScene>
  3. #include <QGraphicsView>
  4. #include <QDateTime>
  5. #include <QTabWidget>
  6. #include <QMessageBox>
  7. #include <QVBoxLayout>
  8. #include <algorithm> // 引入 std::sort
  9. HMIModule::HMIModule(Ui::MainWindow* ui, QObject *parent)
  10. : QObject{parent}, ui_(ui), m_scene(nullptr)
  11. {}
  12. void HMIModule::setButtonIcon(QAbstractButton *button, const QString &iconPath)
  13. {
  14. button->setIcon(QIcon(iconPath));
  15. button->setIconSize(QSize(30, 30));
  16. }
  17. void HMIModule::init() {
  18. setButtonIcon(ui_->button, ":/resource/image/button.png");
  19. setButtonIcon(ui_->lamp, ":/resource/image/lamp.png");
  20. setButtonIcon(ui_->addPage, ":/resource/image/add.png");
  21. setButtonIcon(ui_->deletePage, ":/resource/image/delete.png");
  22. setButtonIcon(ui_->prePage, ":/resource/image/pre.png");
  23. setButtonIcon(ui_->nextPage, ":/resource/image/next.png");
  24. if (!ui_->hmiGraphicsView->scene()) {
  25. m_scene = new CustomGraphicsScene(ui_->hmiGraphicsView, this);
  26. m_scene->setSceneRect(0, 0, 800, 600);
  27. ui_->hmiGraphicsView->setScene(m_scene);
  28. } else {
  29. m_scene = qobject_cast<CustomGraphicsScene*>(ui_->hmiGraphicsView->scene());
  30. Q_ASSERT(m_scene);
  31. }
  32. connect(ui_->button, &QPushButton::clicked, this, &HMIModule::prepareToCreateButton);
  33. connect(ui_->lamp, &QPushButton::clicked, this, &HMIModule::prepareToCreateIndicator);
  34. connect(m_scene, &CustomGraphicsScene::componentCreated, this, &HMIModule::onComponentCreated);
  35. connect(m_scene, &CustomGraphicsScene::copyRequestFromScene, this, &HMIModule::onCopyRequested);
  36. connect(m_scene, &CustomGraphicsScene::pasteRequestFromScene, this, &HMIModule::onPasteRequested);
  37. connect(m_scene, &CustomGraphicsScene::deleteRequestFromScene, this, &HMIModule::onDeleteRequested);
  38. // 连接新增的槽函数
  39. connect(ui_->addPage, &QPushButton::clicked, this, &HMIModule::addPage);
  40. connect(ui_->deletePage, &QPushButton::clicked, this, &HMIModule::deletePage);
  41. connect(ui_->prePage, &QPushButton::clicked, this, &HMIModule::prePage);
  42. connect(ui_->nextPage, &QPushButton::clicked, this, &HMIModule::nextPage);
  43. }
  44. void HMIModule::setupNewComponent(HmiComponent* item)
  45. {
  46. if (!item) return;
  47. connect(item, &HmiComponent::selected, this, &HMIModule::onComponentSelected);
  48. connect(item, &HmiComponent::copyRequested, this, &HMIModule::onCopyRequested);
  49. connect(item, &HmiComponent::deleteRequested, this, &HMIModule::onDeleteRequested);
  50. QString currentTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
  51. QString log = QString("[%1] 创建 %2 组件")
  52. .arg(currentTime)
  53. .arg(item->componentName());
  54. emit logMessageGenerated(log);
  55. }
  56. void HMIModule::prepareToCreateButton()
  57. {
  58. m_scene->setComponentTypeToCreate(ComponentType::Button);
  59. m_scene->setMode(CustomGraphicsScene::Mode::CreateItem);
  60. }
  61. void HMIModule::prepareToCreateIndicator()
  62. {
  63. m_scene->setComponentTypeToCreate(ComponentType::Indicator);
  64. m_scene->setMode(CustomGraphicsScene::Mode::CreateItem);
  65. }
  66. void HMIModule::onComponentCreated(HmiComponent* item)
  67. {
  68. setupNewComponent(item);
  69. }
  70. void HMIModule::onCopyRequested()
  71. {
  72. QList<QGraphicsItem*> selected = m_scene->selectedItems();
  73. if (selected.isEmpty()) return;
  74. HmiComponent* itemToCopy = qgraphicsitem_cast<HmiComponent*>(selected.first());
  75. if (!itemToCopy) return;
  76. if (dynamic_cast<HmiButton*>(itemToCopy)) {
  77. m_copiedType = ComponentType::Button;
  78. } else if (dynamic_cast<HmiIndicator*>(itemToCopy)) {
  79. m_copiedType = ComponentType::Indicator;
  80. }
  81. m_copiedColor = itemToCopy->color();
  82. m_hasCopiedItem = true;
  83. emit logMessageGenerated(QString("[%1] 复制组件: %2")
  84. .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
  85. .arg(itemToCopy->componentName()));
  86. }
  87. void HMIModule::onPasteRequested(const QPointF& scenePos)
  88. {
  89. if (!m_hasCopiedItem) return;
  90. HmiComponent* newItem = nullptr;
  91. if (m_copiedType == ComponentType::Button) {
  92. newItem = new HmiButton();
  93. } else {
  94. newItem = new HmiIndicator();
  95. }
  96. if (newItem) {
  97. newItem->setColor(m_copiedColor);
  98. newItem->setPos(scenePos);
  99. m_scene->addItem(newItem);
  100. setupNewComponent(newItem);
  101. }
  102. }
  103. void HMIModule::onDeleteRequested()
  104. {
  105. QList<QGraphicsItem*> selected = m_scene->selectedItems();
  106. if (selected.isEmpty()) return;
  107. emit logMessageGenerated(QString("[%1] 删除 %2 个组件")
  108. .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"))
  109. .arg(selected.count()));
  110. for (int i = selected.count() - 1; i >= 0; --i) {
  111. QGraphicsItem* item = selected.at(i);
  112. m_scene->removeItem(item);
  113. delete item;
  114. }
  115. }
  116. void HMIModule::onComponentSelected(HmiComponent* item)
  117. {
  118. }
  119. // 新增页面的槽函数
  120. void HMIModule::addPage()
  121. {
  122. QTabWidget* tabWidget = ui_->tabWidget_2; // 获取TabWidget
  123. int pageNumber;
  124. // 检查是否有可用的页面编号
  125. if (!m_availablePageNumbers.isEmpty()) {
  126. // 获取最小的可用的页面编号 (QList 已经是有序的)
  127. pageNumber = m_availablePageNumbers.first();
  128. m_availablePageNumbers.removeFirst();
  129. } else {
  130. // 如果没有可用的页面编号,则使用 m_pageCount 并递增
  131. pageNumber = ++m_pageCount;
  132. }
  133. // 创建新的页面部件
  134. QWidget* newPage = new QWidget(tabWidget);
  135. QString pageName = QString("Page %1").arg(pageNumber);
  136. newPage->setObjectName(pageName);
  137. // 创建新的 GraphicsView 和 Scene
  138. QGraphicsView* newGraphicsView = new QGraphicsView(newPage);
  139. CustomGraphicsScene* newScene = new CustomGraphicsScene(newGraphicsView, this);
  140. newScene->setSceneRect(0, 0, 800, 600);
  141. newGraphicsView->setScene(newScene);
  142. // 布局
  143. QVBoxLayout* layout = new QVBoxLayout(newPage);
  144. layout->addWidget(newGraphicsView);
  145. newPage->setLayout(layout);
  146. // 添加到 TabWidget
  147. tabWidget->addTab(newPage, pageName);
  148. tabWidget->setCurrentWidget(newPage);
  149. //记录日志
  150. emit logMessageGenerated(QString("[%1] 添加页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName));
  151. }
  152. // 删除页面的槽函数
  153. void HMIModule::deletePage()
  154. {
  155. QTabWidget* tabWidget = ui_->tabWidget_2;
  156. int currentIndex = tabWidget->currentIndex();
  157. if (tabWidget->count() == 1) {
  158. QMessageBox::information(nullptr, "提示", "这是最后一页,不能删除!");
  159. return;
  160. }
  161. if (currentIndex >= 0) {
  162. // 获取要删除的页面
  163. QWidget* currentPage = tabWidget->widget(currentIndex);
  164. QString pageName = tabWidget->tabText(currentIndex);
  165. // 从页面名称中提取页面编号
  166. int pageNumber = pageName.remove("Page ").toInt();
  167. // 将删除的页面编号添加到可用列表中,并保持列表有序
  168. m_availablePageNumbers.append(pageNumber);
  169. std::sort(m_availablePageNumbers.begin(), m_availablePageNumbers.end());
  170. // 从 TabWidget 中移除页面
  171. tabWidget->removeTab(currentIndex);
  172. // 删除页面
  173. delete currentPage;
  174. // 记录日志
  175. emit logMessageGenerated(QString("[%1] 删除页面: %2").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")).arg(pageName));
  176. }
  177. }
  178. // 前一页的槽函数
  179. void HMIModule::prePage()
  180. {
  181. QTabWidget* tabWidget = ui_->tabWidget_2;
  182. int currentIndex = tabWidget->currentIndex();
  183. if (currentIndex > 0) {
  184. tabWidget->setCurrentIndex(currentIndex - 1);
  185. }
  186. }
  187. // 后一页的槽函数
  188. void HMIModule::nextPage()
  189. {
  190. QTabWidget* tabWidget = ui_->tabWidget_2;
  191. int currentIndex = tabWidget->currentIndex();
  192. if (currentIndex < tabWidget->count() - 1) {
  193. tabWidget->setCurrentIndex(currentIndex + 1);
  194. }
  195. }