ydtray.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "ydtray.h"
  2. namespace ydTray {
  3. QSystemTrayIcon* g_trayIcon = nullptr;
  4. QMenu* g_trayMenu = nullptr;
  5. void installTray(QWidget* mainwindow) {
  6. if (!mainwindow)
  7. return;
  8. // if (!ydTray::isSubsys()) {
  9. // return;
  10. // }
  11. // 检查系统是否支持托盘
  12. if (!QSystemTrayIcon::isSystemTrayAvailable()) {
  13. //QMessageBox::critical(nullptr, "错误", "系统不支持托盘功能!");
  14. qDebug() << QString("错误, 系统不支持托盘功能!");
  15. }
  16. // 禁用程序退出时自动关闭托盘(默认关闭,需手动处理)
  17. QApplication::setQuitOnLastWindowClosed(false);
  18. // 1. 创建托盘图标
  19. g_trayIcon = new QSystemTrayIcon(mainwindow);
  20. // 设置托盘图标(可替换为自己的图标,支持 QIcon 格式)
  21. g_trayIcon->setIcon(QIcon(QPixmap(QStringLiteral(":/new/prefix1/ElcIcon.png")))/*mainwindow->windowIcon()*/); // 用主窗口图标
  22. g_trayIcon->setToolTip(QString("ElcServer")); // 鼠标悬停提示
  23. // 2. 创建托盘右键菜单
  24. g_trayMenu = new QMenu(mainwindow);
  25. // 菜单动作:显示主窗口
  26. QAction* showAction = new QAction(QString("显示窗口"), mainwindow);
  27. QObject::connect(showAction, &QAction::triggered, mainwindow, &QWidget::showNormal);
  28. // 菜单动作:隐藏主窗口
  29. QAction* hideAction = new QAction(QString("隐藏窗口"), mainwindow);
  30. QObject::connect(hideAction, &QAction::triggered, mainwindow, &QWidget::hide);
  31. // 菜单动作:退出程序
  32. QAction* quitAction = new QAction(QString("退出"), mainwindow);
  33. QObject::connect(quitAction, &QAction::triggered, mainwindow, &QWidget::close);
  34. // 添加动作到菜单
  35. g_trayMenu->addAction(showAction);
  36. g_trayMenu->addAction(hideAction);
  37. g_trayMenu->addSeparator(); // 分隔线
  38. g_trayMenu->addAction(quitAction);
  39. // 关联菜单到托盘图标
  40. g_trayIcon->setContextMenu(g_trayMenu);
  41. // 3. 托盘图标双击事件(如双击显示窗口)
  42. QObject::connect(g_trayIcon, &QSystemTrayIcon::activated,
  43. [=](QSystemTrayIcon::ActivationReason reason) {
  44. if (reason == QSystemTrayIcon::DoubleClick) {
  45. mainwindow->showNormal(); // 双击显示窗口
  46. }
  47. }
  48. );
  49. // 4. 显示托盘图标
  50. g_trayIcon->show();
  51. }
  52. void unstallTray() {
  53. if (!ydTray::isSubsys()) {
  54. return;
  55. }
  56. if (g_trayIcon) {
  57. g_trayIcon->hide();
  58. }
  59. if (g_trayMenu) {
  60. qDeleteAll(g_trayMenu->actions());
  61. g_trayMenu->deleteLater();
  62. }
  63. g_trayMenu = nullptr;
  64. if (g_trayIcon) {
  65. g_trayIcon->deleteLater();
  66. }
  67. g_trayIcon = nullptr;
  68. }
  69. bool isSubsys() {
  70. return QApplication::arguments().contains("-subsys");
  71. }
  72. void changeWindowStyle(QWidget* mainwindow /* = nullptr */) {
  73. if (!ydTray::isSubsys()) {
  74. return;
  75. }
  76. mainwindow->hide();
  77. mainwindow->setWindowFlags(mainwindow->windowFlags() | Qt::Tool);
  78. }
  79. }