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. 【pandas小技巧】--字符串转数值

    字符串转数字的用途和场景很多,其中主要包括以下几个方面: 数据清洗:在进行数据处理时,经常会遇到一些数据类型不匹配的问题,比如某些列中的字符串类型被误认为是数字类型,此时需要将这些字符串类型转换为数字 ...

  2. Springboot多种字段copy工具比较

    结论:推荐使用spring自带的copy工具,不能copy的手动set 1.springboot自带的BeanUtils.copyProperties package com.admin; impor ...

  3. ORACEL12C ORA-01033:ORACLE 正在初始化或关闭

    问题:客户端报ORA-01033 原因:oracle12C CDB启动,但是可拔插的PDB实例未启动 解决办法: sqlplus / as sysdba--系统管理员登录 alter session ...

  4. c语言代码练习4(改进)

    #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <wi ...

  5. 基于AI模型的验证码安全识别(B站,知乎等)

      bilibili 汉字识别顺序验证码 实现基本思路:    先利用Selenium模拟登录,当然在这之前做好请求伪装,get方法使边框最大化,并且将系统的windows窗口缩放比例设置为100%, ...

  6. Java算法之动态规划

    ①动态规划 动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程.20世纪50年代初,美国数学家贝尔曼(R.Bellman)等人在研究多阶段决策过程的 ...

  7. C#学习笔记--复杂数据类型、函数和结构体

    C#基础 复杂数据类型 特点:多个数据变量地一个集合体,可以自己命名 种类:枚举.数组和结构体 枚举:整型常量的集合 数组:任意变量类型的顺序存储的数据集合 结构体:任意变量类型的数据组合成的数据块 ...

  8. OpenJDK17-JVM源码阅读-ZGC-并发标记

    1.ZGC简介 1.1 介绍 ZGC 是一款低延迟的垃圾回收器,是 Java 垃圾收集技术的最前沿,理解了 ZGC,那么便可以说理解了 java 最前沿的垃圾收集技术. 从 JDK11 中作为试验特性 ...

  9. 关于LUN的归属控制器

    ALUA (Asymmetric logic Unit Access)  架构 在ALUA (Asymmetric logic Unit Access)  架构中,LUN有归属控制器,客户在创建LUN ...

  10. Sell Pigs 题解

    Sell Pigs 双倍经验 题目大意 有 \(n\) 个顾客前来买猪,共有 \(m\) 个猪圈,每个顾客携带着某一些猪圈的钥匙,需要买一定数量的猪.在顾客买完后,我们可以将打开的猪圈中的猪随意移动, ...