从0到1,手把手带你开发截图工具ScreenCap------003实现最小化程序到托盘运行

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

ScreenCap---Version:003

说明

上一篇:实现默认位置设置

  • 从0到1,手把手带你开发截图工具ScreenCap------003实现最小化程序到托盘运行
  • 从0到1,手把手带你开发截图工具ScreenCap------003实现最小化程序到托盘运行
  • 从0到1,手把手带你开发截图工具ScreenCap------003实现最小化程序到托盘运行
  • 为了方便截图干净,实现最小化程序到托盘运行,简洁,勿扰
  • 实现最小化程序到托盘运行
  • 实现托盘菜单功能
  • 实现回显主窗体
  • 实现托盘开始截屏
  • 实现气泡信息提示
  • 实现托盘程序提示
  • 实现托盘退出程序
  • 封装完好,可复用

警告

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

GitHub

  • 仓库master下的ScreenCap项目
  • 若您无法正常访问,每次项目的资源会随文章一同发布,下载压缩包即可,永久免费
  • 压缩包可能较GitHub更新不及时,请谅解

开发环境

  • win10系统
  • 编译器qtcreator4.11.1
  • QT版本:5.14.2
  • C++11

问题解决

博主自己的MinTray实现托盘

需求

  • 实现关闭程序时供用户选择,是最小化程序到托盘还是直接关闭
  • 最小化程序到托盘,弹出气泡信息,提示程序已经最小化到托盘运行了
  • 在托盘运行的时候应该提供菜单功能
  • 实现回显主窗体
  • 实现开始截屏功能
  • 实现退出程序的功能

结构

  • 从0到1,手把手带你开发截图工具ScreenCap------003实现最小化程序到托盘运行

思路

  • 要实现托盘运行,首先要有一个托盘类,新建一个继承自QObject的TrayIcon类即可,在这个类中我们实现自己的托盘程序
  • 由于这个类只实现了托盘功能,功能单一,为了方便以后对他的扩展,这里仍然使用单例模式实现
  • 先把托盘程序的ico文件作为资源文件引入到程序里
  • 先实现单例吧
  • 单例实现完后,这个类已经被创建出来了,这里我们使用QT自带的QSystemTrayIcon实现托盘,在这个类中,维持该类的对象trayIcon,为什么有这个类了,我们还要自己实现TaryIcon呢,因为要封装,不能所有的代码都写在主窗体中,太难维护了,如果不懂,可以补一补设计模式的知识
  • 还需要维持其所属的主窗体和含有的菜单选项
  • 这个类自己不需要创建,供其他的类使用,这里我们对外暴漏出设置所属的主窗体接口setMainWidget,谁调用谁就是主窗体,方便回显主窗体
  • 接着暴露设置托盘可见属性的getVisible和setVisible接口
  • 还有鼠标放到托盘上的提示信息接口setToolTip,要不谁知道你的托盘是干什么的
  • 最后是系统提示消息showMessage,上面的都有谁调用谁设置
  • 先来处理默认构造函数,初始化主窗体,没人调用就是0,设置固定不变的图标
  • 在setMainWidget中,这里与调用的窗体进行关联,同时设置菜单,添加上回显主界面,开始截屏,退出程序的功能
  • 这个TrayIcon基本定义完了,下面是需要跟screencapwidget关联上,我们是需要点击关闭事件的时候处理,那么重写closeEvent事件即可,判断是最小化程序到托盘运行还是关闭程序

关键代码

  • 重写CloseEvent事件

    void ScreenCapWidget::closeEvent(QCloseEvent *event)
    {
        //弹出一个选择按钮,是否最小化程序到托盘运行
        QMessageBox::StandardButton button = QMessageBox::question(this,
                                                                   "提示",
                                                                   "是否最小化到系统托盘",
                                                                   QMessageBox::Yes|QMessageBox::No,
                                                                  QMessageBox::Yes);
        //不关闭程序,最小化程序到托盘运行
        if(button == QMessageBox::Yes)
        {
            //设置托盘所属的主窗体
            TrayIcon::getInstance()->setMainWidget(this);
            //忽略关闭事件
            event->ignore();
            //隐藏主窗口
            this->hide();
            //设置托盘可见
            TrayIcon::getInstance()->setVisible(true);
            TrayIcon::getInstance()->setToolTip("ScreenCap");
            TrayIcon::getInstance()->showMessage("ScrennCap托盘运行",
                                                 "已最小化");
    
        }
        //关闭程序
        else
        {
            event->accept();
        }
    }
    
  • 回显主界面

    //回显主界面
    void TrayIcon::showMainWidget()
    {
        if(mainWidget)
        {
            mainWidget->showNormal();
            mainWidget->activateWindow();
        }
    }
    
    
  • 开始截屏

    //托盘开始截屏
    void TrayIcon::StartCap()
    {
        ScreenWidget::Instance()->showFullScreen();
    }
    
  • 退出程序

    //退出菜单功能
    void TrayIcon::closeAll()
    {
        //隐藏,删掉,退出
        trayIcon->hide();
        trayIcon->deleteLater();
        qApp->exit();
    }
    
  • 单例实现

    QScopedPointer<TrayIcon> TrayIcon::self;
    
    //定义单例
    TrayIcon* TrayIcon::getInstance()
    {
        if(self.isNull())
        {
            static QMutex mutex;
            QMutexLocker locker(&mutex);
            if(self.isNull())
            {
                self.reset(new TrayIcon);
            }
        }
    
        return self.data();
    }
    
  • TrayIcon.h

    #ifndef TRAYICON_H
    #define TRAYICON_H
    
    #include <QObject>
    #include<QSystemTrayIcon>
    class QMenu;
    
    class TrayIcon : public QObject
    {
        Q_OBJECT
    public:
        explicit TrayIcon(QObject *parent = nullptr);
        static TrayIcon* getInstance();
    private:
        static QScopedPointer<TrayIcon> self;
        //维持所属的主窗体
        QWidget* mainWidget;
        //维持托盘对象
        QSystemTrayIcon* trayIcon;
        //维持托盘菜单
        QMenu* menu;
    public:
        //所属的主窗体
        void setMainWidget(QWidget* mainWidget);
        //获取可见和不可见
        bool getVisible() const;
        void setVisible(bool visible);
        //设置鼠标放上去的提示信息
        void setToolTip(const QString& tip);
        //设置最小化托盘后的系统提示信息
        void showMessage(const QString& title,
                         const QString& msg,
                         QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information,
                         int msec = 5000);
    public Q_SLOTS:
        //退出
        void closeAll();
        //回显主窗体
        void showMainWidget();
        //开始截屏
        void StartCap();
    private slots:
    
    signals:
    
    };
    
    #endif // TRAYICON_H
    
    
  • TrayIcon.cpp文章来源地址https://www.toymoban.com/news/detail-749556.html

    #include "trayicon.h"
    #include"qmutex.h"
    #include"qapplication.h"
    #include"qmenu.h"
    #include"screenwidget.h"
    QScopedPointer<TrayIcon> TrayIcon::self;
    
    //定义单例
    TrayIcon* TrayIcon::getInstance()
    {
        if(self.isNull())
        {
            static QMutex mutex;
            QMutexLocker locker(&mutex);
            if(self.isNull())
            {
                self.reset(new TrayIcon);
            }
        }
    
        return self.data();
    }
    
    TrayIcon::TrayIcon(QObject *parent) : QObject(parent)
    {
        mainWidget = 0;
        //实例化托盘对象
        trayIcon = new QSystemTrayIcon(this);
        //设置托盘图标
        trayIcon->setIcon(QIcon(":/mintray.ico"));
    
        //实例化托盘菜单
        menu = new QMenu;
    }
    
    
    
    //定义设置所属的主窗体
    void TrayIcon::setMainWidget(QWidget *mainWidget)
    {
        this->mainWidget = mainWidget;
    
    
        menu->addAction("主界面",this,SLOT(showMainWidget()));
        menu->addAction("开始截屏",this,SLOT(StartCap()));
        menu->addAction("退出",this,SLOT(closeAll()));
    
        trayIcon->setContextMenu(menu);
    
    }
    //设置提示信息
    void TrayIcon::setToolTip(const QString &tip)
    {
        trayIcon->setToolTip(tip);
    }
    
    //设置气泡信息
    void TrayIcon::showMessage(const QString &title, const QString &msg, QSystemTrayIcon::MessageIcon icon, int msec)
    {
        trayIcon->showMessage(title,msg,icon,msec);
    }
    
    //实现显示托盘
    bool TrayIcon::getVisible() const
    {
        return trayIcon->isVisible();
    }
    
    void TrayIcon::setVisible(bool visible)
    {
        trayIcon->setVisible(visible);
    }
    
    //实现槽函数
    //退出菜单功能
    void TrayIcon::closeAll()
    {
        //隐藏,删掉,退出
        trayIcon->hide();
        trayIcon->deleteLater();
        qApp->exit();
    }
    //回显主界面
    void TrayIcon::showMainWidget()
    {
        if(mainWidget)
        {
            mainWidget->showNormal();
            mainWidget->activateWindow();
        }
    }
    
    //托盘开始截屏
    void TrayIcon::StartCap()
    {
        ScreenWidget::Instance()->showFullScreen();
    }
    
    
    
    

到了这里,关于从0到1,手把手带你开发截图工具ScreenCap------003实现最小化程序到托盘运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 手把手带你使用VSCode 搭建 STM32开发环境!

    手把手带你使用VSCode 搭建 STM32开发环境!

    首先附上一张VS Code图一直都喜欢这种,黑色主题感觉高大上。 下载最新版VS Code: 安装好插件,具有良好的代码补全与调试功能。 “ VS Code下载地址:https://code.visualstudio.com/ ” 下载 LLVM:用于代码补全,其实可以理解为 Clang。因为VS Code 中“C/C++”插件的自动补全功能不太好

    2024年02月07日
    浏览(73)
  • 手把手带你开发Cesium三维场景【3D智慧城市警情预警】

    手把手带你开发Cesium三维场景【3D智慧城市警情预警】

    📢 鸿蒙专栏:想学鸿蒙的,冲 📢 C语言专栏:想学C语言的,冲 📢 VUE专栏:想学VUE的,冲这里 📢 CSS专栏:想学CSS的,冲这里 📢 Krpano专栏:想学VUE的,冲这里 🔔 上述专栏,都在不定期持续更新中!!!!!!!!!!!!! ​​ 警情模拟示例 本文主要用于构建Ce

    2024年02月03日
    浏览(14)
  • Android:手把手带你入门跨平台UI开发框架Flutter

    Android:手把手带你入门跨平台UI开发框架Flutter

    定义:一款Google出品开源的移动客户端UI开发框架(SDK) 作用:用一套代码同时在Android、iOS上快速构建高质量、高性能的原生用户界面 开发语言:Dart语言(高开发效率、高性能等) 2. 特点 Flutter的主要特点包括:使用自身的高性能渲染引擎进行渲染 Dart编程语言语言 具体介

    2024年04月13日
    浏览(39)
  • 手把手带你写一份优秀的开发求职简历(五)技术能力如何凸显优势

    前言 前面的几小节,把 个人信息 和 教育背景 的模块做了讲述,这两个模块处于简历的 第一屏最顶部 ,可以说 HR 会第一眼看见,所以很重要,同时也通过一些讲述告诉求职者从这些方面如何 扬长避短 ,抓住 HR

    2024年02月02日
    浏览(41)
  • 记录--手把手教你,用electron实现截图软件

    记录--手把手教你,用electron实现截图软件

    因为我们日常开发项目的时候,需要和同事对接 api 和 文档 还有 UI图 ,所以有时候要同时打开多个窗口,并在多个窗口中切换,来选择自己要的信息,如果 api 和 文档 不多的情况还好,但是有时候就是要做大量的页面,为了提升效率我决定自己做一个截图工具,并把自己要

    2024年02月12日
    浏览(14)
  • Android:手把手带你入门跨平台UI开发框架Flutter,渣本Android开发小伙如何一步步成为架构师

    Android:手把手带你入门跨平台UI开发框架Flutter,渣本Android开发小伙如何一步步成为架构师

    3.1 框架结构 Flutter框架主要分为两层:FrameWork层、Engine层,如下图所示: 说明:开发时,主要基于Framework层;运行时,则是运行在 Engine上。每层的具体介绍如下: 3.2 原理概述 开发时,主要基于Framework层;运行时,则是运行在 Engine上 Engine是Flutter的独立虚拟机,由它适配 提

    2024年04月16日
    浏览(38)
  • 【JUnit技术专题】「入门到精通系列」手把手+零基础带你玩转单元测试,让你的代码更加“强壮”(实战开发篇)

    本节内容主要介绍JUnit单元测试功能框架,并以实战演练的形式进行讲解。本系列教程主要针对代码编程方式和模型,重点讲解实战代码开发。通过本系列教程的学习,您将能够深入了解JUnit单元测试框架的使用和原理,并掌握如何在实际项目中运用JUnit进行单元测试。 以下是

    2024年02月03日
    浏览(46)
  • 手把手带你搞懂AMS启动原理

    手把手带你搞懂AMS启动原理

    彻底搞懂AMS即ActivityManagerService,看这一篇就够了 最近那么多教学视频(特别是搞车载的)都在讲AMS,可能这也跟要快速启动一个app(甚至是提高安卓系统启动速度有关),毕竟作为安卓系统的核心系统服务之一,AMS以及PMS都是很重要的,而我之前在 应用的开端–PackageManag

    2024年02月12日
    浏览(207)
  • 【手把手带你学JavaSE】String类(下篇)

    【手把手带你学JavaSE】String类(下篇)

    上篇我们已经学习了String类的一些知识,接下来我们接着学习! 字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法。 static String valueof() 数值转字符串 Integer.parseInt() 字符串整形 Double.parseDouble() 字符串转浮点型 String toUpperCase() 转大写 String toLowerCase() 转小

    2024年02月01日
    浏览(155)
  • 手把手带你调参Yolo v5(二)

    手把手带你调参Yolo v5(二)

    来源:投稿 作者:王同学 ​​​​​​​编辑:学姐 今天我们继续上次的YOLOv5参数解析,这次主要解析源码中train.py文件中包含的参数。 1.1\\\'--weights\\\' 1.2\\\'--cfg\\\' 1.3\\\'--data\\\' 1.4\\\'--hyp\\\' 1.5\\\'--epochs\\\' 1.6\\\'--batch-size\\\' 1.7\\\'--imgsz\\\', \\\'--img\\\', \\\'--img-size\\\' 1.8\\\'--rect\\\'🍀 1.9\\\'--resume\\\'🍀 1.10\\\'--nosave\\\' 1.11\\\'--nova

    2024年02月05日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包