ScreenCap---Version:003

说明

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

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

警告

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

GitHub

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

开发环境

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

问题解决

博主自己的MinTray实现托盘

需求

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

结构

思路

  • 要实现托盘运行,首先要有一个托盘类,新建一个继承自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

    #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实现最小化程序到托盘运行的更多相关文章

  1. 从0开始,手把手教你开发并部署上线一个知识测验微信小程序

    上线项目演示 微信搜索[放马来答]或扫以下二维码体验: 项目源码 项目源码 其他版本 Vue答题App实战教程 Hello小程序 1.注册微信小程序 点击立即注册,选择微信小程序,按照要求填写信息 2 ...

  2. MFC开发--截图工具

    近期学习了MFC的相关知识,MFC(Microsoft Foundation Classes)是微软公司提供的一个类库,可以这样简单理解,就是对于Win32的封装(MFC对windows API函数的 ...

  3. 手把手带你开发一款 IIS 模块后门

    https://cloud.tencent.com/developer/article/1507913 首先准备工具 VS2017 IIS 开始开发 先打开 VS 创建一个 winfrom 项目然后添 ...

  4. springboot开发人员工具(自动重启及相关的配置)

    导入依赖: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> ...

  5. 【VS开发】开发最小化到托盘的功能

    在VC++中,想实现最小化MFC程序的时候,最小化到系统托盘,需要调用NOTIFYICONDATA类 下面我们就来讲解一下如何简单实现一个系统托盘我们以对话框程序为列 第一步:在Dlg类中//定义一个 ...

  6. Android:手把手带你深入剖析 Retrofit 2.0 源码

    前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜 ...

  7. Java开发不懂Docker,学尽Java也枉然,阿里P8架构师手把手带你玩转Docker实战

    转: Java开发不懂Docker,学尽Java也枉然,阿里P8架构师手把手带你玩转Docker实战 Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一 ...

  8. Android性能优化:手把手带你全面实现内存优化

      前言 在 Android开发中,性能优化策略十分重要 本文主要讲解性能优化中的内存优化,希望你们会喜欢 目录   1. 定义 优化处理 应用程序的内存使用.空间占用 2. 作用 避免因不正确使用内 ...

  9. 手把手教你开发chrome扩展

    转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html 手把手教你开发chrome扩展一:开发Chrome Extenst ...

  10. 手把手教你开发Chrome扩展三:关于本地存储数据

    手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...

随机推荐

  1. Baby_python 反编译

    ok,直接pyc直接反编译 逻辑清楚 拿到flag直接搞 结果提交给错了我把前缀改成flag{}这种格式也给错真是摸不着头脑 难道是base64解密错误?? 找了另外一个网站 ???这个是啥?? 与之 ...

  2. 如何调用API接口获取商品数据

    在当今数字化的时代,电子商务的崛起使得网购成为了人们生活中不可或缺的一部分.作为电子商务中最为熟知和流行的平台之一,拥有大量的商品资源和用户群体.如果你是一名开发者或者是对数据分析感兴趣的人,你可能会 ...

  3. git status详解

    git status详解 在使用Git进行版本控制时,git status是一个非常有用的命令,用于查看当前代码仓库的状态.它可以告诉你哪些文件已更改.添加或删除,以及是否有未提交的更改等.本篇博客文 ...

  4. C# Wke使用例子 (KyozyWke)

    概述 wke是国人大牛BlzFans封装的webkit, 基于chrome浏览器源代码的裁剪版本, 大小只有仅仅10M. 无需依赖其他的扩展库就可以在本地使用谷歌内核快速加载网页. wke是2011年 ...

  5. 织梦dede邮箱发信配置教程

    环境要求 主机465端口是开启和放行的 php扩展openssl是开启的 php扩展sockets是开启的 1.QQ邮箱或者163邮箱.126邮箱,开启SMTP服务,拿到授权码,根据自己的来 QQ邮箱 ...

  6. 「note」原根照抄

    阶(multiplicative order) \(\textbf{Def.}\):\(\delta_m(a)\) 为最小的 \(n\) 使得 \(a^n\equiv 1\pmod m\),其中 \( ...

  7. 基于go语言gin框架的web项目骨架

    该骨架每个组件之间可单独使用,组件之间松耦合,高内聚,组件的实现基于其他三方依赖包的封装. 目前该骨架实现了大多数的组件,比如事件,中间件,日志,配置,参数验证,命令行,定时任务等功能,目前可以满足大 ...

  8. Redis系列之——高级用法

    文章目录 一 慢查询 1.1 生命周期 1.2 两个配置 1.2.1 slowlog-max-len 1.2.2 slowlog-max-len 1.2.3 配置方法 1.3 三个命令 1.4 经验 ...

  9. 教育法学第八章单元测试MOOC

    第八章单元测试 返回 本次得分为:100.00/100.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(5分) 社团法人与财团法 ...

  10. 校招零Offer要不要先找实习?

    国庆前后被问到最多的问题是:"磊哥,我现在还是 0 Offer,要不要先去找个实习?",给大家看看部分截图. 同学 A: 同学 B: 同学 C: 其他还有一些截图,我这里就不一一贴 ...