QT最小化程序到托盘运行

这篇具有很好参考价值的文章主要介绍了QT最小化程序到托盘运行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MinTray

说明

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

警告

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

GitHub

QtDemo下的Mintray

开发环境

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

问题解决

  • 单例模式
  • QSystemTrayIcon

需求

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

结构

  • QT最小化程序到托盘运行
  • QT最小化程序到托盘运行

思路

  • 这里主要为了实现关闭程序的时候实现程序托盘运行的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();
    }
    
  • 设置调用的主窗体,并绑定相关的功能文章来源地址https://www.toymoban.com/news/detail-748997.html

    //定义设置所属的主窗体
    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最小化程序到托盘运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt 自定义窗口的标题栏,重写鼠标事件实现,关闭隐藏,最大化/最小化,重写窗口事件函数,实现鼠标选中边框拉大拉小,双击标题栏切换窗口最大化和最小化

    Qt 自定义窗口的标题栏,重写鼠标事件实现,关闭隐藏,最大化/最小化,重写窗口事件函数,实现鼠标选中边框拉大拉小,双击标题栏切换窗口最大化和最小化 1、main.cpp 2、widget.h 3、widget.cpp 4、效果展示 5、完成

    2024年02月16日
    浏览(70)
  • 【Qt UI相关】Qt中如何控制 窗口的最大化、最小化和关闭按钮?一文带你掌握用法

    窗口的最大化、最小化和关闭按钮通常是由操作系统的窗口管理器控制的,而不是由应用程序控制的。这些按钮的行为(例如点击最大化按钮会将窗口的大小调整为屏幕的大小)是由窗口管理器实现的,应用程序通常不能改变这些行为。 在 Qt 中,你可以通过 QWidget::setWindow

    2024年02月11日
    浏览(42)
  • mac 最小化全部程序回到桌面(基于alfred workflow)

    换到 mac 系统之后,很多快捷键根本就不好用,组合太多了,除了 cmd + Q/W/A/S/X/R/Z/C/V ,个人认为其它的真的一坨屎。像我的需求就是,开的窗口太多了,我需要全部最小化,再重新打开我需要那个窗口。而 Windows 上的 win + D 就是很符合我的需求,于是我研究一下 mac 怎么实现

    2024年04月17日
    浏览(45)
  • 机器学习的学习准则(期望风险最小化、经验风险最小化、结构风险最小化)

    训练集是有N个独立同分布的样本组成,即每个样本(x,y)是独立的从相同的分布中抽取的。这个真实的分布未知 输入空间X和输出空间Y构成样本空间,对于样本空间中的样本(x, y)∈X x Y,假定x和y之间可通过一个未知的真实隐射y=g(x)来描述,或者通过真实条件概率分布来描述。

    2024年02月09日
    浏览(53)
  • win10/win11程序窗口最小化后, 点击任务栏无法弹出的问题处理

    在本人使用win10、win11系统时,有时打开某个程序的多个窗口,最小化该程序窗口后,长时间不对该窗口做任何操作。 在较长时间后,点击任务栏,发现无法弹出该程序窗口,但是在任务栏上 右键 点击该窗口图标,选择 关闭窗口 可以正常关闭该窗口,说明程序未卡死、 这种

    2024年02月16日
    浏览(58)
  • 关于Windows桌面远程后,unity程序无法全屏显示或者显示窗口默认最小化解决方法

    按以下步骤操作 1、Win+R打开运行,然后输入regedit打开注册表 2、根据计算机HKEY_CURRENT_USERSoftwareDefaultCompany路径找到DefaultCompany的文件夹 3、在DefaultCompany文件夹下找到unity打包时exe文件对应名称的文件夹,右键删除整个文件夹,删除后再去启动unity.exe程序即可恢复正常显示画

    2024年04月10日
    浏览(81)
  • DFA的最小化

    一、实验目的 1.熟练掌握DFA与NFA的定义与有关概念。 2.理解并掌握确定的有穷自动机的最小化等算法。 二、实验要求 输入:DFA 输出:最小化的DFA 三、实验过程 1.化简DFA关键在于把它的状态集分成一些两两互不相交的子集,使得任何两个不相交的子集间的状态都是可区分

    2024年02月09日
    浏览(52)
  • 捕获最小化窗口的缩略图画面

    : capture minimized window window thumbnail IsIconic  最小化的窗口,API GetClientRect 返回的窗口尺寸是0x0,故无法通过GetDC+BitBlt捕获到窗口画面。 但是 Agora/zoom/tencentMeeting 都可以拿到最小化窗口的缩略图。经确认这个程序并没有注入任何dll到目标窗口,且也没有临时显示最小化了

    2024年02月07日
    浏览(50)
  • LeetCode——最小化字符串长度

    目录 一、题目 二、题目解读  三、代码  1、set去重 2、用一个二进制数记录每个字母是否出现过 6462. 最小化字符串长度 - 力扣(Leetcode) 给你一个下标从  0  开始的字符串  s  ,重复执行下述操作  任意  次: 在字符串中选出一个下标  i  ,并使  c  为字符串下标  i

    2024年02月08日
    浏览(61)
  • LabVIEW开发最小化5G系统测试平台

    LabVIEW开发最小化5G系统测试平台 由于具有大量存储能力和数据的应用程序的智能手机的激增,当前一代产品被迫提高其吞吐效率。正交频分复用由于其卓越的品质,如单抽头均衡和具有成本效益的实施,现在被广泛用作物理层技术。这些好处是以严格的同步、正交性和高功耗

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包