mainwindow.cpp 9.8 KB

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