首页 > 编程语言 >QT最小化程序到托盘运行

QT最小化程序到托盘运行

时间:2023-12-06 20:12:13浏览次数:46  
标签:QT TrayIcon 关闭程序 托盘 窗体 最小化 mainWidget

MinTray

说明

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

警告

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

GitHub

QtDemo下的Mintray

开发环境

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

问题解决

需求

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

结构

  • image
  • image

思路

  • 这里主要为了实现关闭程序的时候实现程序托盘运行的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,TrayIcon,关闭程序,托盘,窗体,最小化,mainWidget
From: https://www.cnblogs.com/kanhai1024/p/17880423.html

相关文章

  • 记录——Qt Qcreator 顶部菜单栏的隐藏与恢复
    问题我有一个朋友,手残点击了QCreator中视图下的这个玩意儿:当人的眼神不好时,可能不会看到这些快捷键以及无视这些弹窗。解决方案快捷键ctrl+alt+M可恢复或者隐藏顶部工具菜单栏......
  • 深入理解和实现Qt中的单例模式
    在Qt框架中,单例模式的实现是一个常见的需求,它有多种实现方式,每种都有其特点。以下是对这些方法的探讨,包括宏定义方式、模板类方式,以及Qt的内置单例宏,并附有具体的使用示例。宏定义方式的单例模式宏定义方式是一种传统且直接的实现单例模式的方法,但它可能导致代码重复和类型安全......
  • MQTT I/O模块:锂电池生产数据安全的坚实保障
    锂电池的生产工艺分为前、中、后三个阶段:其中后段则是检测封装,核心工序为化成、分容。分容是对电池进行一定充放电检测,将电池按容量分类的过程,后工序分档是通过对电池各项性能和产品指标进行检验(容量、电压、内阻、K值、厚度、外观等),将电池按照产品等级标准分开的过程。I/O模块应用......
  • Qt/C++视频监控拉流显示/各种rtsp/rtmp/http视频流/摄像头采集/视频监控回放/录像存储
    一、前言本视频播放组件陆陆续续写了6年多,一直在持续更新迭代,视频监控行业客户端软件开发首要需求就是拉流显示,比如给定一个rtsp视频流地址,你需要在软件上显示实时画面,其次就是录像保存,再次就是一些周边的处理比如贴OSD,做图片分析等。拉流显示是第一步,如果有跨平台的需求,个人推荐......
  • QT学习笔记-QTimer
    官方解释:TheQTimerclassprovidesrepetitiveandsingle-shottimers这个类提供了可重复的和单次的定时器。QTimer类为定时器提供了高级编程接口。使用:创建一个QTimer将timeout()信号连接到适当的槽,然后调用start()。完成1,2步后,它会以恒定的时间间隔发出timeout()信号......
  • Qt 项目打包成exe可执行程序
    1、先构建release2、删掉文件夹内多余的文件3、使用windeployqt工具再打包就可以了......
  • c++ json的解析和QT中json的操作
    1.下载jsoncpp源码2.首先建议jsoncpp源码编译成动态库https://www.bilibili.com/video/BV1pb4y1W7ZZhttps://www.bilibili.com/video/BV1Ra4y1e7gL (1)用QT的Cmake工具 (2)用Visualstudio a.工具打开jsoncpp源码,在CMakeLists.txt右键->jsoncpp的CMak......
  • WPF 最大化,最小化,关闭,拖拽,双击事件
    十年河东,十年河西,莫欺少年穷学无止境,精益求精代码如下publicMainView(){InitializeComponent();//最小化btnMin.Click+=(s,e)=>{this.WindowState=WindowState.Minimized;};//最大化b......
  • Windows 缺失Qt5.xxxx.dll,无法继续执行代码
    事件起因:客户自行安装完Autodesk系软件后,软件一直弹窗报错AutodDesktopApp.exe-系统错误Windows软件报错:由于找不到Qt5.xxxx.dll,无法继续执行代码,重新安装程序可以能会解决此问题 解决办法:在已经使用DirectXRepair修复软件修复过C++插件,仍然报错的前提下,以管理员身份......
  • Qt - macOS上实现Qt应用程序做文件关联打开
    一、背景介绍  用Qt开发的应用程序要实现文件关联,双击时用默认关联的程序打开文件,在Windows上这个功能非常容易实现。Windows应用程序在安装的时候可以在注册表中写入相关的键值对。打开文件的时候,WindowsExplorer会将文件完整的路径作为参数传递给关联的应用程序。这样就可......