MinTray

说明

  • 实现程序关闭时最小化托盘的功能
  • 托盘实现显示主页面和退出的功能
  • 支持扩展,直接引用TrayIcon类即可,对外暴露接口
  • 单例实现,可复用

警告

  • 注:博主所有资源永久免费,若有帮助,请点赞转发是对我莫大的帮助
  • 注:博主本人学习过程的分享,引用他人的文章皆会标注原作者
  • 注:本人文章非盈利性质,若有侵权请联系我删除
  • 注:获取资源或者咨询问题请联系Q:2950319782
  • 注:博主本人很菜,文章基本是二次创作,大佬请忽略我的随笔
  • 注:我会一步步分享实现的细节,若仍有问题联系我

GitHub

QtDemo下的Mintray

开发环境

  • win10系统
  • qtcreator4.11.1
  • QT版本:5.14.2

问题解决

需求

  • 程序在关闭的时候需要供用户选择是直接关闭程序还是最小化在托盘运行
  • 在托盘运行,程序主界面要隐藏
  • 托盘要提供最基本的显示回主界面和退出程序的功能

结构

思路

  • 这里主要为了实现关闭程序的时候实现程序托盘运行的demo,随便创建一个widget程序Tray即可,重写窗口的CloseEvent事件,处理关闭程序和最小化到托盘运行的功能
  • 使用QT自带的QSystemTrayIcon来实现托盘的功能,单独创建一个TrayIcon类来封装,继承自Object即可,不需要ui文件,
  • 由于托盘这个类功能比较单一,而且是需要的 时候才创建,而且不能跟随调用者的生存周期,这里使用懒汉单例实现最好,最好使用智能指针,省的发生内存泄漏,在Tray窗口需要的时候才创建
  • 下面先来实现TrayIcon的单例,这里使用返回static TrayIcon* 的Instance函数加独占智能指针实现
  • 这里我是选择在CloseEvent事件中创建TrayIcon实例
  • 在TrayIcon类中,首先需要维持所属的主窗体mainWidget和托盘对象trayIcon,同时定义public的设置主窗体函数setMainWidget来设置调用的主窗体
  • 在TrayIcon的构造函数中实例化托盘对象trayIcon,设置图标,完成初始配置
  • 到这里只要设置托盘为可见,托盘就已经可以显示出来了,但是没法关闭程序和显示主页面了,下面来实现这两个功能
  • 首先创建菜单QMenu,因为这个菜单功能主要是跟主窗口的交互,那么在传入主窗口的setMainWidget函数中设置菜单为好
  • 先加上回显主窗体的功能,定义回显函数showMainWidget
  • 下面处理关闭程序的功能,这里最好是设置一个是关闭托盘还是关闭程序的标志位,判断一下最好
  • 菜单功能处理后,是需要将菜单和鼠标右键绑定,否则不能处理相关操作
  • 最后处理一下托盘激活程序,为了简单,这里双击和单击都回显主窗体

关键代码

  • 重写CloseEvent事件

    void Tray::closeEvent(QCloseEvent *event)
    {
    //弹出一个选择按钮,是否最小化程序到托盘运行
    QMessageBox::StandardButton button = QMessageBox::question(this,"提示","是否最小化到系统托盘", QMessageBox::Yes|QMessageBox::No,
    QMessageBox::Yes);
    //不关闭程序,最小化程序到托盘运行
    if(button == QMessageBox::Yes)
    {
    //设置托盘所属的主窗体
    TrayIcon::Instance()->setMainWidget(this);
    //忽略关闭事件
    event->ignore();
    //隐藏主窗口
    this->hide();
    //设置托盘可见
    TrayIcon::Instance()->setVisible(true);
    //设置提示消息,看不见消息的是电脑开启了勿扰模式
    TrayIcon::Instance()->showMessage("自定义最小化托盘",
    "已最小化");
    }
    //关闭程序
    else
    {
    event->accept();
    }
    }
  • 实现懒汉单例

    //定义懒汉单例
    TrayIcon* TrayIcon::Instance()
    {
    if(self.isNull())
    {
    static QMutex mutex;
    QMutexLocker locker(&mutex);
    if(self.isNull())
    {
    self.reset(new TrayIcon);
    }
    }
    return self.data();
    }
  • 回显主窗体函数

    //定义显示主界面的槽函数
    void TrayIcon::showMainWidget()
    {
    //有主窗体
    if(mainWidget)
    {
    //显示出来主窗体
    mainWidget->showNormal();
    //重新聚焦主窗体
    mainWidget->activateWindow();
    }
    }
  • 关闭程序函数

    //定义关闭的槽函数
    void TrayIcon::closeAll()
    {
    //隐藏,并删掉,退出程序
    trayIcon->hide();
    trayIcon->deleteLater();
    qApp->exit();
    }
  • 设置调用的主窗体,并绑定相关的功能

    //定义设置所属的主窗体
    void TrayIcon::setMainWidget(QWidget *mainWidget)
    {
    this->mainWidget = mainWidget;
    //给托盘加上菜单功能
    menu->addAction("主界面",this,SLOT(showMainWidget()));
    //直接退出
    if(exitDirect)
    {
    menu->addAction("退出",this,SLOT(closeAll()));
    }
    else
    {
    menu->addAction("退出",this,SIGNAL(trayIconExit()));
    }
    //菜单绑定到右键
    trayIcon->setContextMenu(menu); }

QT最小化程序到托盘运行的更多相关文章

  1. WPF应用最小化至系统托盘运行

    原文:WPF应用最小化至系统托盘运行 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/5178889 ...

  2. 将 VMware 最小化到系统托盘

    1, 下载 Trayconizer官网地址: http://www.whitsoftdev.com/trayconizer/下载地址: http://www.whitsoftdev.com/files ...

  3. Delphi 7下最小化到系统托盘

    在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789   _NOTIFY ...

  4. Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)

    在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789   _NOTIFY ...

  5. C# WinForm窗口最小化到系统托盘

    * C# WinForm窗口最小化到系统托盘http://hi.baidu.com/kfxtgtqyapouyze/item/8ccfdcd5a174a7312a35c7c3 主要功能:(1).程序启 ...

  6. 大神为你分析 Go、Java、C 等主流编程语言(Go可以替代Java,而且最小化程序员的工作量,学习比较容易)

    本文主要分析 C.C++98.C++11.Java 与 Go,主要论述语言的关键能力.在论述的过程中会结合华为各语言编程专家和华为电信软件内部的骨干开发人员的交流,摒弃语言偏好或者语言教派之争,尽量以 ...

  7. 将Mozilla ThunderBird最小化到系统托盘(转载)

    转自:http://be-evil.org/mozilla-thunderbird-minize-to-tray.html Mozilla ThunderBird是一款非常不错的邮件客户端,但是其在默 ...

  8. electron监听系统托盘,electron是否最小化到系统托盘

    在项目中需要判断窗口是否最小化在系统托盘上,任务栏那已经关闭,查了一晚上的api,始终找不到可以调用的方法,最后绞尽脑汁想到了一个办法,那就是在点右上角的关闭按钮时,加个全局变量,用来标识已经最小到系 ...

  9. MFC程序最小化到系统托盘及其响应函数

    预备知识: Windows API函数: WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid ...

  10. Delphi 最小化程序到任务栏托盘 增加右键PopMenu

    在做中间层时,中间层往往不需要点击关闭时立刻关闭,而是最小化到托盘.故而特意隐藏关闭按钮功能. 1)隐藏退出功能 用PopMenu退出菜单代替 1.增加popMenu退出菜单,绑定到窗体 2.增加变量 ...

随机推荐

  1. Unity UGUI的InputField(输入框)组件的介绍及使用

    UGUI的InputField(输入框)组件的介绍及使用 1. 什么是UGUI的InputField组件? UGUI的InputField组件是Unity中的一个用户界面组件,用于接收用户的输入.它可 ...

  2. Oracle数据库字符集概述及修改方式

    1.字符集概述 Oracle语言环境的描述包括三部分:language.territory.characterset(语言.地域.字符集) language:主要指定服务器消息的语言,提示信息显示中文 ...

  3. VictoriaLogs:一款超低占用的 ElasticSearch 替代方案

    背景 前段时间我们想实现 Pulsar 消息的追踪流程,追踪实现的效果图如下: 实现其实比较简单,其中最重要的就是如何存储消息. 消息的读取我们是通过 Pulsar 自带的 BrokerInterce ...

  4. 反汇编ARM程序的技术靠谱吗?——揭秘ARM架构二进制程序的反汇编技术现状

    ​  本文系原创,转载请说明出处 Please Subscribe Wechat Official Account:信安科研人,获取更多的原创安全资讯 参考发表在2020年软工顶会ISSTA的论文&l ...

  5. 重要变更 | Hugging Face Hub 的 Git 操作不再支持使用密码验证

    在 Hugging Face,我们一直致力于提升服务安全性,因此,我们将对通过 Git 与 Hugging Face Hub 交互时的认证方式进行更改.从 2023 年 10 月 1 日 开始,我们将 ...

  6. python实现图片提取文字功能

    安装需要的包 # pip install pytesseract # pip install Pillow # 安装OCR环境 # 下载exe安装文件 # https://digi.bib.uni-m ...

  7. 图解 LeetCode 算法汇总——二分查找

    二分查找(Binary Search)是一种在有序数组中查找特定元素的高效算法.它的基本思想是将目标值与数组中间的元素进行比较,如果目标值小于中间元素,则在数组的左半部分继续查找,否则在右半部分查找, ...

  8. Redis 命令工具

    --- Redis 命令工具 --- redis-server Redis 服务器启动命令 redis-cli shutdown 停止服务 redis-benchmark:性能测试工具,用于检测 Re ...

  9. 基于go语言gin框架的web项目骨架

    该骨架每个组件之间可单独使用,组件之间松耦合,高内聚,组件的实现基于其他三方依赖包的封装. 目前该骨架实现了大多数的组件,比如事件,中间件,日志,配置,参数验证,命令行,定时任务等功能,目前可以满足大 ...

  10. 使用ensp搭建路由拓扑,并使用ospf协议实现网络互通实操

    转载请注明出处: 1.使用ENSP 搭建如下拓扑: 数据准备 为完成此配置例,需准备如下的数据: 设备 Router ID Process ID IP地址 DeviceA 1.1.1.1 1 区域0: ...