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

打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

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事件
    1. void ScreenCapWidget::closeEvent(QCloseEvent *event)
    2. {
    3.     //弹出一个选择按钮,是否最小化程序到托盘运行
    4.     QMessageBox::StandardButton button = QMessageBox::question(this,
    5.                                                                "提示",
    6.                                                                "是否最小化到系统托盘",
    7.                                                                QMessageBox::Yes|QMessageBox::No,
    8.                                                               QMessageBox::Yes);
    9.     //不关闭程序,最小化程序到托盘运行
    10.     if(button == QMessageBox::Yes)
    11.     {
    12.         //设置托盘所属的主窗体
    13.         TrayIcon::getInstance()->setMainWidget(this);
    14.         //忽略关闭事件
    15.         event->ignore();
    16.         //隐藏主窗口
    17.         this->hide();
    18.         //设置托盘可见
    19.         TrayIcon::getInstance()->setVisible(true);
    20.         TrayIcon::getInstance()->setToolTip("ScreenCap");
    21.         TrayIcon::getInstance()->showMessage("ScrennCap托盘运行",
    22.                                              "已最小化");
    23.     }
    24.     //关闭程序
    25.     else
    26.     {
    27.         event->accept();
    28.     }
    29. }
    复制代码
  • 回显主界面
    1. //回显主界面
    2. void TrayIcon::showMainWidget()
    3. {
    4.     if(mainWidget)
    5.     {
    6.         mainWidget->showNormal();
    7.         mainWidget->activateWindow();
    8.     }
    9. }
    复制代码
  • 开始截屏
    1. //托盘开始截屏
    2. void TrayIcon::StartCap()
    3. {
    4.     ScreenWidget::Instance()->showFullScreen();
    5. }
    复制代码
  • 退出程序
    1. //退出菜单功能
    2. void TrayIcon::closeAll()
    3. {
    4.     //隐藏,删掉,退出
    5.     trayIcon->hide();
    6.     trayIcon->deleteLater();
    7.     qApp->exit();
    8. }
    复制代码
  • 单例实现
    1. QScopedPointer<TrayIcon> TrayIcon::self;
    2. //定义单例
    3. TrayIcon* TrayIcon::getInstance()
    4. {
    5.     if(self.isNull())
    6.     {
    7.         static QMutex mutex;
    8.         QMutexLocker locker(&mutex);
    9.         if(self.isNull())
    10.         {
    11.             self.reset(new TrayIcon);
    12.         }
    13.     }
    14.     return self.data();
    15. }
    复制代码

  • TrayIcon.h
    1. #ifndef TRAYICON_H
    2. #define TRAYICON_H
    3. #include <QObject>
    4. #include<QSystemTrayIcon>
    5. class QMenu;
    6. class TrayIcon : public QObject
    7. {
    8.     Q_OBJECT
    9. public:
    10.     explicit TrayIcon(QObject *parent = nullptr);
    11.     static TrayIcon* getInstance();
    12. private:
    13.     static QScopedPointer<TrayIcon> self;
    14.     //维持所属的主窗体
    15.     QWidget* mainWidget;
    16.     //维持托盘对象
    17.     QSystemTrayIcon* trayIcon;
    18.     //维持托盘菜单
    19.     QMenu* menu;
    20. public:
    21.     //所属的主窗体
    22.     void setMainWidget(QWidget* mainWidget);
    23.     //获取可见和不可见
    24.     bool getVisible() const;
    25.     void setVisible(bool visible);
    26.     //设置鼠标放上去的提示信息
    27.     void setToolTip(const QString& tip);
    28.     //设置最小化托盘后的系统提示信息
    29.     void showMessage(const QString& title,
    30.                      const QString& msg,
    31.                      QSystemTrayIcon::MessageIcon icon = QSystemTrayIcon::Information,
    32.                      int msec = 5000);
    33. public Q_SLOTS:
    34.     //退出
    35.     void closeAll();
    36.     //回显主窗体
    37.     void showMainWidget();
    38.     //开始截屏
    39.     void StartCap();
    40. private slots:
    41. signals:
    42. };
    43. #endif // TRAYICON_H
    复制代码
  • TrayIcon.cpp
    1. #include "trayicon.h"#include"qmutex.h"#include"qapplication.h"#include"qmenu.h"#include"screenwidget.h"QScopedPointer<TrayIcon> TrayIcon::self;
    2. //定义单例
    3. TrayIcon* TrayIcon::getInstance()
    4. {
    5.     if(self.isNull())
    6.     {
    7.         static QMutex mutex;
    8.         QMutexLocker locker(&mutex);
    9.         if(self.isNull())
    10.         {
    11.             self.reset(new TrayIcon);
    12.         }
    13.     }
    14.     return self.data();
    15. }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);}//实现槽函数//退出菜单功能
    16. void TrayIcon::closeAll()
    17. {
    18.     //隐藏,删掉,退出
    19.     trayIcon->hide();
    20.     trayIcon->deleteLater();
    21.     qApp->exit();
    22. }//回显主界面
    23. void TrayIcon::showMainWidget()
    24. {
    25.     if(mainWidget)
    26.     {
    27.         mainWidget->showNormal();
    28.         mainWidget->activateWindow();
    29.     }
    30. }//托盘开始截屏
    31. void TrayIcon::StartCap()
    32. {
    33.     ScreenWidget::Instance()->showFullScreen();
    34. }
    复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表