mainwindow.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. #include "mainwindow.h"
  2. #include <QToolBar>
  3. #include <QAction>
  4. #include <QStackedWidget>
  5. #include <QHBoxLayout>
  6. #include <QStatusBar>
  7. #include <QLabel>
  8. #include <QSettings>
  9. #include <QMenuBar>
  10. #include <QMenu>
  11. #include <QShortcut>
  12. #include <QMessageBox>
  13. MainWindow::MainWindow(QWidget *parent)
  14. : QMainWindow(parent)
  15. {
  16. createUI();
  17. }
  18. void MainWindow::createUI()
  19. {
  20. // 创建菜单栏
  21. createMenuBar();
  22. // 创建主布局
  23. QWidget *centralWidget = new QWidget(this);
  24. QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);
  25. // 界面设置
  26. setWindowTitle("软件总线");
  27. setWindowIcon(QIcon(":/qrc/icons/ads_icon.svg"));
  28. setUnifiedTitleAndToolBarOnMac(true);
  29. setDockNestingEnabled(true);
  30. setAnimated(true);
  31. setTabPosition(Qt::AllDockWidgetAreas, QTabWidget::North);
  32. setDockOptions(QMainWindow::AllowTabbedDocks | QMainWindow::AnimatedDocks | QMainWindow::VerticalTabs);
  33. setStatusBar(new QStatusBar(this));
  34. setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
  35. setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
  36. setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
  37. setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
  38. setMinimumSize(800, 600);
  39. setMaximumSize(1600, 1200);
  40. // 创建页面堆栈
  41. m_pageStack = new QStackedWidget(this);
  42. mainLayout->addWidget(m_pageStack);
  43. centralWidget->setLayout(mainLayout);
  44. setCentralWidget(centralWidget);
  45. // 创建工具栏和页面
  46. createHomeToolbar();
  47. createSerialToolbar();
  48. createSettingsToolbar();
  49. createHelpToolbar();
  50. // 默认显示主界面
  51. switchToPage(1);
  52. // 设置快捷键
  53. setupShortcuts();
  54. // 链接信号槽
  55. connectSignals();
  56. // 创建状态栏
  57. this->statusBar()->showMessage("就绪");
  58. }
  59. void MainWindow::createMenuBar()
  60. {
  61. // 创建菜单栏
  62. QMenuBar *menuBar = new QMenuBar(this);
  63. setMenuBar(menuBar);
  64. // 文件菜单
  65. QMenu *fileMenu = menuBar->addMenu("文件");
  66. QAction *newAction = fileMenu->addAction(QIcon(":/qrc/icons/new.png"), "新建");
  67. QAction *openAction = fileMenu->addAction(QIcon(":/qrc/icons/open.png"), "打开");
  68. QAction *saveAction = fileMenu->addAction(QIcon(":/qrc/icons/save.png"), "保存");
  69. fileMenu->addSeparator();
  70. QAction *exitAction = fileMenu->addAction(QIcon(":/qrc/icons/exit.png"), "退出");
  71. // 编辑菜单
  72. QMenu *editMenu = menuBar->addMenu("编辑");
  73. QAction *undoAction = editMenu->addAction(QIcon(":/qrc/icons/undo.png"), "撤销");
  74. QAction *redoAction = editMenu->addAction(QIcon(":/qrc/icons/redo.png"), "重做");
  75. editMenu->addSeparator();
  76. QAction *cutAction = editMenu->addAction(QIcon(":/qrc/icons/cut.png"), "剪切");
  77. QAction *copyAction = editMenu->addAction(QIcon(":/qrc/icons/copy.png"), "复制");
  78. QAction *pasteAction = editMenu->addAction(QIcon(":/qrc/icons/paste.png"), "粘贴");
  79. // 视图菜单
  80. QMenu *viewMenu = menuBar->addMenu("视图");
  81. QAction *homeAction = viewMenu->addAction(QIcon(":/qrc/icons/home.png"), "主界面");
  82. QAction *serialAction = viewMenu->addAction(QIcon(":/qrc/icons/serial.png"), "串口");
  83. QAction *settingsAction = viewMenu->addAction(QIcon(":/qrc/icons/settings.png"), "设置");
  84. QAction *helpAction = viewMenu->addAction(QIcon(":/qrc/icons/help.png"), "帮助");
  85. // 连接视图菜单的切换功能
  86. connect(homeAction, &QAction::triggered, this, [this]()
  87. { switchToPage(0); });
  88. connect(serialAction, &QAction::triggered, this, [this]()
  89. { switchToPage(1); });
  90. connect(settingsAction, &QAction::triggered, this, [this]()
  91. { switchToPage(2); });
  92. connect(helpAction, &QAction::triggered, this, [this]()
  93. { switchToPage(3); });
  94. // 帮助菜单
  95. QMenu *helpMenu = menuBar->addMenu("帮助");
  96. QAction *helpDocAction = helpMenu->addAction(QIcon(":/qrc/icons/help.png"), "帮助文档");
  97. QAction *aboutAction = helpMenu->addAction(QIcon(":/qrc/icons/about.png"), "关于");
  98. QAction *updateAction = helpMenu->addAction(QIcon(":/qrc/icons/update.png"), "检查更新");
  99. connect(aboutAction, &QAction::triggered, this, &MainWindow::showAbout);
  100. }
  101. void MainWindow::createHomeToolbar()
  102. {
  103. // 创建主界面工具栏
  104. Toolbar *homeToolbar = new Toolbar("主工具栏", this);
  105. addToolBar(Qt::TopToolBarArea, homeToolbar);
  106. homeToolbar->hide();
  107. // 添加按钮
  108. homeToolbar->addAction(QIcon(":/qrc/icons/new.png"), "新建");
  109. homeToolbar->addAction(QIcon(":/qrc/icons/open.png"), "打开");
  110. homeToolbar->addAction(QIcon(":/qrc/icons/save.png"), "保存");
  111. homeToolbar->addAction(QIcon(":/qrc/icons/print.png"), "打印");
  112. // 创建主界面页面
  113. QLabel *homePage = new QLabel("<center><h1>主界面</h1></center>", this);
  114. homePage->setAlignment(Qt::AlignCenter);
  115. // 添加到堆栈
  116. m_toolbars.append(homeToolbar);
  117. m_pageStack->addWidget(homePage);
  118. }
  119. // 串口界面
  120. void MainWindow::createSerialToolbar()
  121. {
  122. // 创建串口界面工具栏
  123. Toolbar *serialToolbar = new Toolbar("主工具栏", this);
  124. addToolBar(Qt::TopToolBarArea, serialToolbar);
  125. serialToolbar->hide();
  126. // 添加按钮
  127. serialToolbar->addAction(QIcon(":/qrc/icons/new.png"), "新建");
  128. serialToolbar->addAction(QIcon(":/qrc/icons/open.png"), "打开");
  129. serialToolbar->addAction(QIcon(":/qrc/icons/save.png"), "保存");
  130. serialToolbar->addAction(QIcon(":/qrc/icons/print.png"), "打印");
  131. // 创建串口界面页面
  132. QWidget *serialPage = new QWidget(this);
  133. QVBoxLayout *serialLayout = new QVBoxLayout(serialPage);
  134. // 创建 ViewSerial,不把 serialPage 当 parent(更安全)
  135. m_viewSerial = new ViewSerial(nullptr);
  136. // 将 m_viewSerial 添加到 serialPage 的布局中(关键)
  137. serialLayout->addWidget(m_viewSerial);
  138. // 添加到堆栈
  139. m_toolbars.append(serialToolbar);
  140. m_pageStack->addWidget(serialPage);
  141. }
  142. void MainWindow::createSettingsToolbar()
  143. {
  144. // 创建设置界面工具栏
  145. Toolbar *settingsToolbar = new Toolbar("设置工具栏", this);
  146. addToolBar(Qt::TopToolBarArea, settingsToolbar);
  147. settingsToolbar->hide();
  148. // 添加按钮
  149. settingsToolbar->addAction(QIcon(":/qrc/icons/preferences.png"), "首选项");
  150. settingsToolbar->addAction(QIcon(":/qrc/icons/theme.png"), "主题");
  151. settingsToolbar->addAction(QIcon(":/qrc/icons/keyboard.png"), "快捷键");
  152. settingsToolbar->addAction(QIcon(":/qrc/icons/plugins.png"), "插件");
  153. // 创建设置界面页面
  154. QLabel *settingsPage = new QLabel("<center><h1>设置界面</h1></center>", this);
  155. settingsPage->setAlignment(Qt::AlignCenter);
  156. // 添加到堆栈
  157. m_toolbars.append(settingsToolbar);
  158. m_pageStack->addWidget(settingsPage);
  159. }
  160. void MainWindow::createHelpToolbar()
  161. {
  162. // 创建帮助界面工具栏
  163. Toolbar *helpToolbar = new Toolbar("帮助工具栏", this);
  164. addToolBar(Qt::TopToolBarArea, helpToolbar);
  165. helpToolbar->hide();
  166. // 添加按钮
  167. helpToolbar->addAction(QIcon(":/qrc/icons/help.png"), "帮助文档");
  168. helpToolbar->addAction(QIcon(":/qrc/icons/about.png"), "关于");
  169. helpToolbar->addAction(QIcon(":/qrc/icons/update.png"), "检查更新");
  170. // 创建帮助界面页面
  171. QLabel *helpPage = new QLabel("<center><h1>帮助界面</h1></center>", this);
  172. helpPage->setAlignment(Qt::AlignCenter);
  173. // 添加到堆栈
  174. m_toolbars.append(helpToolbar);
  175. m_pageStack->addWidget(helpPage);
  176. }
  177. /*
  178. function: 返回指定索引的页面
  179. @author: flower
  180. @date: 2025-10-23
  181. @param index 页面索引
  182. @return 无
  183. */
  184. void MainWindow::switchToPage(int index)
  185. {
  186. // 隐藏所有工具栏
  187. for (Toolbar *toolbar : m_toolbars)
  188. {
  189. toolbar->hide();
  190. }
  191. // 显示当前工具栏
  192. if (index >= 0 && index < m_toolbars.size())
  193. {
  194. m_toolbars[index]->show();
  195. m_pageStack->setCurrentIndex(index);
  196. }
  197. }
  198. /*
  199. function: 设置快捷键
  200. @author: flower
  201. @date: 2025-10-23
  202. @param
  203. @return 无
  204. */
  205. void MainWindow::setupShortcuts()
  206. {
  207. // 创建快捷键
  208. QShortcut *homeShortcut = new QShortcut(QKeySequence("Ctrl+1"), this);
  209. QShortcut *serialShortcut = new QShortcut(QKeySequence("Ctrl+2"), this);
  210. QShortcut *settingsShortcut = new QShortcut(QKeySequence("Ctrl+3"), this);
  211. QShortcut *helpShortcut = new QShortcut(QKeySequence("Ctrl+4"), this);
  212. // 连接快捷键信号
  213. connect(homeShortcut, &QShortcut::activated, this, [this]()
  214. { switchToPage(0); });
  215. connect(serialShortcut, &QShortcut::activated, this, [this]()
  216. { switchToPage(1); });
  217. connect(settingsShortcut, &QShortcut::activated, this, [this]()
  218. { switchToPage(2); });
  219. connect(helpShortcut, &QShortcut::activated, this, [this]()
  220. { switchToPage(3); });
  221. }
  222. /*
  223. function: 链接信号槽
  224. @author: flower
  225. @date: 2021-10-23
  226. @param
  227. @return 无
  228. */
  229. void MainWindow::connectSignals()
  230. {
  231. // 连接信号槽
  232. }
  233. void MainWindow::showAbout()
  234. {
  235. QMessageBox::about(this, "关于",
  236. "<h2>基于DoDAF的多源数据融合系统总线</h2>"
  237. "<p> </p>"
  238. "<p>版本: 1.0.0</p>"
  239. "<p>© flower </p>");
  240. }