You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 line
7.1 KiB

  1. #include "mainwindow.h"
  2. #include <QMenuBar>
  3. #include <QAction>
  4. #include <QToolButton>
  5. #include <QMimeData>
  6. #include <QDrag>
  7. #include <QTabBar>
  8. #include <QEvent>
  9. #include <QMouseEvent>
  10. #include <QDragEnterEvent>
  11. #include <QDragMoveEvent>
  12. #include <QDropEvent>
  13. MainWindow::MainWindow(QWidget *parent)
  14. : QMainWindow(parent)
  15. {
  16. setWindowTitle("综合平台编程器");
  17. setGeometry(100, 100, 1000, 700);
  18. // 初始化标签页
  19. m_tabWidget = new QTabWidget(this);
  20. m_tabWidget->setTabsClosable(true);
  21. setCentralWidget(m_tabWidget);
  22. connect(m_tabWidget, &QTabWidget::currentChanged, this, &MainWindow::onTabChanged);
  23. // 创建菜单和工具栏
  24. createMenus();
  25. createToolbars();
  26. }
  27. MainWindow::~MainWindow()
  28. {
  29. // 标签页和工具栏由Qt自动销毁
  30. }
  31. // 创建菜单栏
  32. // 在createMenus()函数中添加以下代码,用于创建操作菜单及其功能
  33. void MainWindow::createMenus()
  34. {
  35. // 创建文件菜单(保持原有代码)
  36. QMenu *fileMenu = menuBar()->addMenu("文件");
  37. QMenu *editMenu = menuBar()->addMenu("操作");
  38. QMenu *simulationMenu = menuBar()->addMenu("仿真");
  39. // 新建HMI动作(保持原有代码)
  40. QAction *newHmiAction = new QAction("新建HMI(&H)", this);
  41. newHmiAction->setShortcut(tr("Ctrl+H"));
  42. newHmiAction->setStatusTip("创建新的HMI文档");
  43. connect(newHmiAction, &QAction::triggered, this, &MainWindow::onNewHMI);
  44. fileMenu->addAction(newHmiAction);
  45. // 新建PLC动作(保持原有代码)
  46. QAction *newPlcAction = new QAction("新建PLC(&P)", this);
  47. newPlcAction->setShortcut(tr("Ctrl+P"));
  48. newPlcAction->setStatusTip("创建新的PLC文档");
  49. connect(newPlcAction, &QAction::triggered, this, &MainWindow::onNewPLC);
  50. fileMenu->addAction(newPlcAction);
  51. // 操作菜单 - 添加复制、粘贴、删除功能
  52. QAction *copyAction = new QAction("复制(&C)", this);
  53. copyAction->setShortcut(QKeySequence::Copy); // 标准复制快捷键 Ctrl+C
  54. copyAction->setStatusTip("复制选中的项目");
  55. connect(copyAction, &QAction::triggered, this, [this]() {
  56. // 获取当前活动的HMI文档
  57. if (auto hmiDoc = dynamic_cast<HMIDocument*>(m_tabWidget->currentWidget())) {
  58. hmiDoc->copySelectedItems();
  59. }
  60. });
  61. QAction *pasteAction = new QAction("粘贴(&V)", this);
  62. pasteAction->setShortcut(QKeySequence::Paste); // 标准粘贴快捷键 Ctrl+V
  63. pasteAction->setStatusTip("粘贴复制的项目");
  64. connect(pasteAction, &QAction::triggered, this, [this]() {
  65. if (auto hmiDoc = dynamic_cast<HMIDocument*>(m_tabWidget->currentWidget())) {
  66. hmiDoc->pasteItems();
  67. }
  68. });
  69. QAction *deleteAction = new QAction("删除(&D)", this);
  70. deleteAction->setShortcut(QKeySequence::Delete); // 删除键
  71. deleteAction->setStatusTip("删除选中的项目");
  72. connect(deleteAction, &QAction::triggered, this, [this]() {
  73. if (auto hmiDoc = dynamic_cast<HMIDocument*>(m_tabWidget->currentWidget())) {
  74. hmiDoc->deleteSelectedItems();
  75. }
  76. });
  77. // 添加到操作菜单
  78. editMenu->addAction(copyAction);
  79. editMenu->addAction(pasteAction);
  80. editMenu->addAction(deleteAction);
  81. }
  82. // 创建左侧工具栏
  83. void MainWindow::createToolbars()
  84. {
  85. m_leftToolBar = new QToolBar("绘图工具", this);
  86. addToolBar(Qt::LeftToolBarArea, m_leftToolBar);
  87. m_leftToolBar->setAllowedAreas(Qt::LeftToolBarArea); // 仅允许在左侧
  88. }
  89. // 更新工具栏(根据当前文档类型)
  90. void MainWindow::updateToolBar(BaseDocument *doc)
  91. {
  92. // 清空现有工具
  93. m_leftToolBar->clear();
  94. if (!doc) return;
  95. // HMI文档显示绘图工具
  96. if (doc->type() == BaseDocument::HMI)
  97. {
  98. HMIDocument *hmiDoc = dynamic_cast<HMIDocument*>(doc);
  99. if (!hmiDoc) return;
  100. // 画指示灯按钮(支持拖拽)
  101. QToolButton *ellipseBtn = new QToolButton;
  102. ellipseBtn->setText("指示灯");
  103. ellipseBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  104. ellipseBtn->setIcon(QIcon("../two/untitled/images/灯泡.png")); // 可替换为实际图标
  105. ellipseBtn->setMinimumSize(120, 120);
  106. connect(ellipseBtn, &QToolButton::clicked, [=]() {
  107. hmiDoc->setDrawEllipse(true);
  108. hmiDoc->setDrawRectangle(false);
  109. });
  110. // 为按钮安装事件过滤器处理拖拽
  111. ellipseBtn->installEventFilter(this);
  112. ellipseBtn->setProperty("toolType", "指示灯");
  113. m_leftToolBar->addWidget(ellipseBtn);
  114. // 画按钮按钮(支持拖拽)
  115. QToolButton *rectBtn = new QToolButton;
  116. rectBtn->setText("按钮");
  117. rectBtn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
  118. rectBtn->setIcon(QIcon("../two/untitled/images/按钮.png")); // 可替换为实际图标
  119. rectBtn->setMinimumSize(120, 120);
  120. connect(rectBtn, &QToolButton::clicked, [=]() {
  121. hmiDoc->setDrawRectangle(true);
  122. hmiDoc->setDrawEllipse(false);
  123. });
  124. // 为按钮安装事件过滤器处理拖拽
  125. rectBtn->installEventFilter(this);
  126. rectBtn->setProperty("toolType", "按钮");
  127. m_leftToolBar->addWidget(rectBtn);
  128. }
  129. // PLC文档可添加自己的工具
  130. else if (doc->type() == BaseDocument::PLC) {
  131. m_leftToolBar->addAction("常开触点");
  132. m_leftToolBar->addAction("常闭触点");
  133. }
  134. }
  135. // 事件过滤器处理拖拽
  136. bool MainWindow::eventFilter(QObject *obj, QEvent *event)
  137. {
  138. // 检查是否是工具栏按钮的鼠标按下事件
  139. QToolButton *toolBtn = qobject_cast<QToolButton*>(obj);
  140. if (toolBtn && event->type() == QEvent::MouseButtonPress)
  141. {
  142. QMouseEvent *me = static_cast<QMouseEvent*>(event);
  143. if (me->button() == Qt::LeftButton)
  144. {
  145. // 获取工具类型
  146. QString toolType = toolBtn->property("toolType").toString();
  147. if (!toolType.isEmpty())
  148. {
  149. // 创建拖拽
  150. QMimeData *mime = new QMimeData;
  151. mime->setText(toolType);
  152. QDrag *drag = new QDrag(obj);
  153. drag->setMimeData(mime);
  154. drag->exec(Qt::CopyAction);
  155. return true;
  156. }
  157. }
  158. }
  159. return QMainWindow::eventFilter(obj, event);
  160. }
  161. // 新建HMI文档
  162. void MainWindow::onNewHMI()
  163. {
  164. m_hmiCount++;
  165. HMIDocument *doc = new HMIDocument;
  166. doc->setTitle(QString("HMI文档 %1").arg(m_hmiCount));
  167. m_tabWidget->addTab(doc, doc->title());
  168. m_tabWidget->setCurrentWidget(doc);
  169. updateToolBar(doc); // 更新工具栏为HMI工具
  170. }
  171. // 新建PLC文档
  172. void MainWindow::onNewPLC()
  173. {
  174. m_plcCount++;
  175. PLCDocument *doc = new PLCDocument;
  176. m_tabWidget->addTab(doc, QString("PLC文档 %1").arg(m_plcCount));
  177. m_tabWidget->setCurrentWidget(doc);
  178. updateToolBar(doc); // 更新工具栏为PLC工具
  179. }
  180. // 标签页切换时更新工具栏
  181. void MainWindow::onTabChanged(int idx)
  182. {
  183. if (idx < 0) {
  184. updateToolBar(nullptr);
  185. return;
  186. }
  187. BaseDocument *doc = dynamic_cast<BaseDocument*>(m_tabWidget->widget(idx));
  188. updateToolBar(doc);
  189. }