从0到1,手把手带你开发截图工具ScreenCap------003实现最小化程序到托盘运行
ScreenCap---Version:003
说明
- 为了方便截图干净,实现最小化程序到托盘运行,简洁,勿扰
- 实现最小化程序到托盘运行
- 实现托盘菜单功能
- 实现回显主窗体
- 实现托盘开始截屏
- 实现气泡信息提示
- 实现托盘程序提示
- 实现托盘退出程序
- 封装完好,可复用
警告
- 注:博主所有资源永久免费,若有帮助,请点赞转发是对我莫大的帮助
- 注:博主本人学习过程的分享,引用他人的文章皆会标注原作者
- 注:本人文章非盈利性质,若有侵权请联系我删除
- 注:获取资源或者咨询问题请联系Q:2950319782
- 注:博主本人很菜,文章基本是二次创作,大佬请忽略我的随笔
- 注:我会一步步分享实现的细节,若仍有问题联系我
GitHub
- 仓库master下的ScreenCap项目
- 若您无法正常访问,每次项目的资源会随文章一同发布,下载压缩包即可,永久免费
- 压缩包可能较GitHub更新不及时,请谅解
开发环境
- win10系统
- 编译器qtcreator4.11.1
- QT版本:5.14.2
- C++11
问题解决
需求
- 实现关闭程序时供用户选择,是最小化程序到托盘还是直接关闭
- 最小化程序到托盘,弹出气泡信息,提示程序已经最小化到托盘运行了
- 在托盘运行的时候应该提供菜单功能
- 实现回显主窗体
- 实现开始截屏功能
- 实现退出程序的功能
结构
思路
- 要实现托盘运行,首先要有一个托盘类,新建一个继承自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_HTrayIcon.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实现最小化程序到托盘运行的更多相关文章
- 从0开始,手把手教你开发并部署上线一个知识测验微信小程序
上线项目演示 微信搜索[放马来答]或扫以下二维码体验: 项目源码 项目源码 其他版本 Vue答题App实战教程 Hello小程序 1.注册微信小程序 点击立即注册,选择微信小程序,按照要求填写信息 2 ...
- MFC开发--截图工具
近期学习了MFC的相关知识,MFC(Microsoft Foundation Classes)是微软公司提供的一个类库,可以这样简单理解,就是对于Win32的封装(MFC对windows API函数的 ...
- 手把手带你开发一款 IIS 模块后门
https://cloud.tencent.com/developer/article/1507913 首先准备工具 VS2017 IIS 开始开发 先打开 VS 创建一个 winfrom 项目然后添 ...
- springboot开发人员工具(自动重启及相关的配置)
导入依赖: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> ...
- 【VS开发】开发最小化到托盘的功能
在VC++中,想实现最小化MFC程序的时候,最小化到系统托盘,需要调用NOTIFYICONDATA类 下面我们就来讲解一下如何简单实现一个系统托盘我们以对话框程序为列 第一步:在Dlg类中//定义一个 ...
- Android:手把手带你深入剖析 Retrofit 2.0 源码
前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜 ...
- Java开发不懂Docker,学尽Java也枉然,阿里P8架构师手把手带你玩转Docker实战
转: Java开发不懂Docker,学尽Java也枉然,阿里P8架构师手把手带你玩转Docker实战 Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一 ...
- Android性能优化:手把手带你全面实现内存优化
前言 在 Android开发中,性能优化策略十分重要 本文主要讲解性能优化中的内存优化,希望你们会喜欢 目录 1. 定义 优化处理 应用程序的内存使用.空间占用 2. 作用 避免因不正确使用内 ...
- 手把手教你开发chrome扩展
转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html 手把手教你开发chrome扩展一:开发Chrome Extenst ...
- 手把手教你开发Chrome扩展三:关于本地存储数据
手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单 手把手教你开发Chrome扩展二:为html添加行为 手把手教你开发Chrome扩展三:关于本地存储数据 HTML5 ...
随机推荐
- MyBatis-Plus批量插入方法saveBatch
1. saveBatch能否提高插入的效率? 先说结论,saveBatch()方法也是一条一条的插入,也就是说它会产生多条insert语句,而不是一条insert语句,所以它不是真正的批量插入,更不能 ...
- SpringBoot如何整合spring-retry来实现接口请求重试
一.重试机制 由于网络不稳定或网络抖动经常会造成接口请求失败的情况,当我们再去尝试就成功了,这就是重试机制. 其主要目的就是要尽可能地提高请求成功的概率,但一般情况下,我们请求第一次失败,代码运行就抛 ...
- 【爬虫实战】用python爬豆瓣电影《热烈》短评
目录 一.爬虫对象-豆瓣电影短评 二.爬取结果 三.爬虫代码讲解 三.演示视频 四.获取完整源码 一.爬虫对象-豆瓣电影短评 您好!我是@马哥python说,一名10年程序猿. 今天分享一期爬虫案例, ...
- lvm格式化挂载分区
1.从物理磁盘创建lvm分区 物理磁盘 /dev/sdb 20G 2.使用fdisk工具创建lvm分区 3.修改默认的分区类型 4.查看新建的分区 5.创建物理卷pv 6.创建逻辑卷组vg,并查看详情 ...
- Python爬虫-IP隐藏技术与代理爬取
在进行爬虫程序开发和运行时,常常会遇到目标网站的反爬虫机制,最常见的就是IP封禁,这时需要使用IP隐藏技术和代理爬取. 一.IP隐藏技术 IP隐藏技术,即伪装IP地址,使得爬虫请求的IP地址不被目标网 ...
- 谱图论:Laplacian二次型和Markov转移算子
以下部分是我学习CMU 15-751: TCS Toolkit的课堂笔记.由于只是个人笔记,因此许多地方在推导上可能不那么严谨,还望理论大佬多多包涵. 1 问题定义 1.1 无向图\(G\) 在本文中 ...
- Quantitative Relationship Induction
数量关系是指事物之间的数值或数量之间的相互关系(+.-.*./). 数量关系描述各种量的变化和相互关系.数量关系可以包括数值的比较.增减.比例.百分比.平均值等方面. 在数学中,数量关系可以通过代数方 ...
- 中华人民共和国企业所得税月(季)度预缴纳税申报表(A类,2018年版)
企业按照<中华人民共和国公司法>有关规定整体改制,包括非公司制企业改制为有限责任公司或股份有限公司,有限责任公司变更为股份有限公司,股份有限公司变更为有限责任公司,原企业投资主体存续并在改 ...
- Qt信号槽与事件循环学习笔记
事件与事件循环 信号槽机制 事件与事件循环 在Qt中,事件(event)被封装为QEvent类/子类对象,用来表示应用内部或外部发生的各种事情.事件可以被任何QObject子类的对象接收并处理. 根据 ...
- 当个 PM 式程序员「GitHub 热点速览」
本周 GitHub 热点依旧是 GPT 类项目,当中的佼佼者自然是本文收录的 gpt-pilot,一周获得了 7k+ star.此外,像是 LangChain.Autogen 之类的 LLM 工具链项 ...



