警告
- 为了方便截图干净,实现最小化程序到托盘运行,简洁,勿扰
- 实现最小化程序到托盘运行
- 实现托盘菜单功能
- 实现回显主窗体
- 实现托盘开始截屏
- 实现气泡信息提示
- 实现托盘程序提示
- 实现托盘退出程序
- 封装完好,可复用
GitHub
- 注:博主所有资源永久免费,若有帮助,请点赞转发是对我莫大的帮助
- 注:博主本人学习过程的分享,引用他人的文章皆会标注原作者
- 注:本人文章非盈利性质,若有侵权请联系我删除
- 注:获取资源或者咨询问题请联系Q:2950319782
- 注:博主本人很菜,文章基本是二次创作,大佬请忽略我的随笔
- 注:我会一步步分享实现的细节,若仍有问题联系我
开发环境
- 仓库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();
- }
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |