QT软件在关闭时缩小到系统托盘

设置成关闭软件但又不关闭后台服务
一、在main函数中设置后台不关闭服务

QApplication a(argc, argv);
a.setOrganizationName("Qtrac Ltd.");                // 设置组织名
a.setOrganizationDomain("qtrac.eu");                // 设置组织域名
a.setQuitOnLastWindowClosed(false);                 // 退出程序后服务不终止

二、设置系统托盘

1、在关闭时成系统托盘状态
首先添加关闭事件

void closeEvent(QCloseEvent *event);                    // 关闭系统事件

2、在关闭函数中添加

m_SystemTrayIcon = new QSystemTrayIcon();
m_SystemTrayIcon->setIcon(QIcon("C:\\Users\\WingThinks-LiKun\\Desktop\\0b46c9ccd624f0ad4f2c3df3b8e3bf4d.png"));     // 托盘时显示的图片
m_SystemTrayIcon->setToolTip(QString::fromLocal8Bit("测试系统托盘图标"));                                             // 鼠标在托盘图片时的提示
//给QSystemTrayIcon添加槽函数
connect(m_SystemTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
//建立托盘操作的菜单
CreatAction();  
CreatMenu();
m_SystemTrayIcon->show();   // 显示图片图标

3、如何还原关闭状态

//添加槽函数
void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
//槽函数中添加
void **::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch (reason) 
    {
    case QSystemTrayIcon::Trigger:
        //单击托盘图标
        /*m_SystemTrayIcon->showMessage(QString::fromLocal8Bit("Message Title"),
                                      QString::fromLocal8Bit("欢迎使用此程序"),
                                      QSystemTrayIcon::Information,
                                      1000);*/
        break;
    case QSystemTrayIcon::DoubleClick:
        //双击托盘图标
        //双击后显示主程序窗口
        this->show();
        m_SystemTrayIcon->hide();
        break;
    default:
        break;
    }
}

4、添加托盘中的菜单

void **::CreatMenu()
{
    m_Menu = new QMenu(this);
    //新增菜单项---显示主界面
    m_Menu->addAction(m_QActionShowMain);
    //增加分隔符
    m_Menu->addSeparator();
    //新增菜单项---退出程序
    m_Menu->addAction(m_QActionExitApp);
    //把QMenu赋给QSystemTrayIcon对象
    m_SystemTrayIcon->setContextMenu(m_Menu);
}

5、添加托盘中的活动

void **::CreatAction()
{
    m_QActionShowMain = new QAction(QString::fromLocal8Bit("显示主界面"), this);
    connect(m_QActionShowMain, SIGNAL(triggered()), this, SLOT(slotActionMain()));

    m_QActionExitApp = new QAction(QString::fromLocal8Bit("退出"), this);
    connect(m_QActionExitApp, SIGNAL(triggered()), this, SLOT(slotActionExitApp()));

}

void **::slotActionMain()
{
    this->show();
    m_SystemTrayIcon->hide();
}

void **::slotActionExitApp()
{
    exit(0);
}

6、托盘图片
托盘图片

要实现程序关闭后显示在系统托盘区,需要使用 Qt 的 QSystemTrayIcon 类。具体实现步骤如下: 1. 在程序初始化创建 QSystemTrayIcon 对象,并设置其图标、提示信息等属性; 2. 重写程序的 closeEvent() 函数,在程序关闭前将其隐藏,并在系统托盘区显示 QSystemTrayIcon 对象; 3. 在 QSystemTrayIcon 对象的 activated() 信号中,处理双击托盘图标显示程序主窗口的事件。 示例代码如下: ```cpp #include <QSystemTrayIcon> #include <QMenu> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建系统托盘图标 trayIcon = new QSystemTrayIcon(this); trayIcon->setIcon(QIcon(":/images/icon.png")); trayIcon->setToolTip(tr("My Application")); // 创建托盘菜单 trayMenu = new QMenu(this); QAction *showAction = new QAction(tr("Show"), this); QAction *quitAction = new QAction(tr("Quit"), this); connect(showAction, &QAction::triggered, this, &MainWindow::showNormal); connect(quitAction, &QAction::triggered, qApp, &QApplication::quit); trayMenu->addAction(showAction); trayMenu->addAction(quitAction); trayIcon->setContextMenu(trayMenu); // 监听系统托盘图标的激活事件 connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::trayIconActivated); } protected: void closeEvent(QCloseEvent *event) override { if (trayIcon->isVisible()) { hide(); event->ignore(); } else { event->accept(); } } private slots: void trayIconActivated(QSystemTrayIcon::ActivationReason reason) { if (reason == QSystemTrayIcon::DoubleClick) { showNormal(); } } private: QSystemTrayIcon *trayIcon; QMenu *trayMenu; }; ``` 在程序退出,需要手动删除 QSystemTrayIcon 对象,代码如下: ```cpp delete trayIcon; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值