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. iostat命令安装及详解

    iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况.同vmstat一样,i ...

  2. redis集群:MASTER aborted replication with an error: NOAUTH Authentication required.

    发现个问题:redis集群所在服务器,磁盘空间很快就被占满,使用 "du -sh *"查看每个文件夹的大小,发现redis集群三个从节点的日志文件占用空间很大. 下面记录问题排查及 ...

  3. 学好Elasticsearch系列-索引的批量操作

    本文已收录至 Github,推荐阅读 Java 随想录 微信公众号:Java 随想录 先看后赞,养成习惯. 点赞收藏,人生辉煌. 目录 基于 mget 的批量查询 基于 bulk 的批量增删改 增加 ...

  4. 【pandas小技巧】--category类型补充

    category类型在pandas基础系列中有一篇介绍数据类型的文章中已经介绍过.category类型并不是python中的类型,是pandas特有的类型. category类型的优势那篇文章已经介绍 ...

  5. 第一个程序PingPong

    功能需求 如图所示,开启两个ping类型的服务ping1和ping2,ping1给ping2发消息,ping2收到回应ping1,ping1收到再回应ping2,不断循环. 服务模块 Skynet提供 ...

  6. Mac上使用Royal TSX快速连接到OCI主机

    问题: 每次使用Royal TSX连接到OCI主机都要交互式输入opc这个用户名,次数多了也蛮烦. 那如何既指定用户名,又想要通过ssh私钥登陆机器呢? 这个需求确实很初级,但也着实困扰过我,因为开始 ...

  7. 一款广受社区好评的 WAF

    大家好,我是 Java陈序员,我们有时会搭建一个属于自己的网站,但是自建网站很容易被收到攻击,今天给大家介绍一款简单免费好用的 WAF 网站防护工具. WAF 是 Web Application Fi ...

  8. Solution -「LOCAL 28731」「重庆市 2021 中学友谊赛」Rainyrabbit 爱求和

    Description Link. \(\operatorname{Rainyrabbit}\) 是一个数学极好的萌妹子,近期他发现了一个可爱的函数: \[f(n,m,k)=\sum_{d=1}^n ...

  9. Linux下jdk配置

    1.首先执行以下命令查看可安装的jdk版本: yum -y list java* ​ 执行成功后可看到如下界面: 2.选择自己需要的jdk版本进行安装,比如这里安装1.8,执行以下命令: yum in ...

  10. 【RocketMQ】RocketMQ 5.0新特性(三)- Controller模式

    在RocketMQ 5.0以前,有两种集群部署模式,分别为主从模式(Master-Slave模式)和Dledger模式. 主从模式 主从模式中分为Master和Slave两个角色,集群中可以有多个Ma ...