• 【Qt开发】实现系统托盘,托盘菜单,托盘消息


    概述

    系统托盘就是在系统桌面底部特定的区域显示运行的程序。windows在任务栏状态区域,linux在布告栏区域。应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能。

     演示Demo实现功能:

    1.应用启动后,任务栏,系统托盘可以看到该程序。

    2.点击右上角×关闭窗口,自动隐藏窗口,托盘可以看到该程序。

    3.鼠标在托盘图标上右键,弹出"退出程序"菜单栏,并带有图标。

    步骤:

    1.工程中新建TrayDialog类,基类是QDialog,在界面上添加Text Browser控件和提示信息。

    2.在TrayDialog.h头文件中添加#include <QtWidgets>包含文件

    3.添加成员变量

        QSystemTrayIcon m_systray,

      信号槽响应函数

        int OnSystemTrayClicked(QSystemTrayIcon::ActivationReason reason);

        int OnExit();

      重写closeEvent(QCloseEvent *event)函数,完整代码如下:

    #pragma once
    #pragma execution_character_set("utf-8")
    
    #include <QDialog>
    #include <QtWidgets>
    #include "ui_TrayDialog.h"
    
    class TrayDialog : public QDialog
    {
        Q_OBJECT
    
    public:
        TrayDialog(QWidget *parent = Q_NULLPTR);
        ~TrayDialog();
    
    private:
        void closeEvent(QCloseEvent *event);
    
    private slots:
        int OnSystemTrayClicked(QSystemTrayIcon::ActivationReason reason);
        int OnExit();
    
    private:
        Ui::TrayDialog ui;
        QSystemTrayIcon m_systray;
    };

    4.在Qt Designer中添加Action,用于托盘右键退出程序。

    5.构造函数TrayDialog(QWidget *parent)中添加如下代码:

        //设置提示文字
        m_systray.setToolTip("系统托盘演示程序");
    
        // 设置托盘图标
        m_systray.setIcon(QIcon(":/qtlearn/Resources/EXE.ico"));
    
    
        //托盘菜单项
        QMenu * menu = new QMenu();
        menu->addAction(ui.actionExit);
        m_systray.setContextMenu(menu);
    
        // 关联托盘事件
        connect(&m_systray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
            this, SLOT(OnSystemTrayClicked(QSystemTrayIcon::ActivationReason)));
    
        //显示托盘
        m_systray.show();
    
        //托盘菜单响应
        connect(ui.actionExit, SIGNAL(triggered()), this, SLOT(OnExit()));

    6.关闭窗口事件响应函数

    /************************************
    @ Brief:        点击关闭窗口
    @ Author:        woniu201 
    @ Created:        2019/03/21
    @ Return:            
    ************************************/
    void TrayDialog::closeEvent(QCloseEvent *event)
    {
        this->hide();
        event->ignore();
    }

    7.双击/单击托盘应用程序响应函数

    /************************************
    @ Brief:        双击/单击托盘事件
    @ Author:        woniu201
    @ Created:        2019/03/21
    @ Return:
    ************************************/
    int TrayDialog::OnSystemTrayClicked(QSystemTrayIcon::ActivationReason reason)
    {
        if (reason == QSystemTrayIcon::Trigger
            || reason == QSystemTrayIcon::DoubleClick)
        {
            // 显示主窗口
            this->showNormal();
        }
        return 0;
    }

    8.托盘右键退出响应函数

    /************************************
    @ Brief:        托盘菜单退出
    @ Author:        woniu201 
    @ Created:        2019/03/21
    @ Return:            
    ************************************/
    int TrayDialog::OnExit()
    {
        QApplication::exit(0);
        return 0;
    }

     9.启动后效果如下

     

  • 相关阅读:
    iOS开发之巧用Block和代理方法结合来传值
    iOS开发之Bug--UITextField使用时文字向下偏移问题
    iOS开发之开源项目链接
    IOS开发之Bug--iOS7View被导航栏遮挡问题的解决
    Android开发--异步加载
    添加 All Exceptions 断点后, 每次运行都会在 main.m 中断的一种解决方法
    IOS开发之Bug--遇到一个类型不确定的bug
    iOS开发之功能模块--计算高度Demo探究手稿
    IOS开发之Bug--View是懒加载导致出误以为是UI加载的bug
    iOS中的round/ceil/floorf函数略解
  • 原文地址:https://www.cnblogs.com/woniu201/p/10573431.html
Copyright © 2020-2023  润新知