QT最小化到托盘显示

news2024/10/12 11:18:26

一、效果:

        程序关闭后,程序并没有退出,而是放入了托盘中;点击恢复原始大小,或者双击托盘图标,可以恢复程序原来的窗口。如下图。

        那qt是如何实现这样的办法呢,其实就是用到了 QSystemTrayIcon类,通常有两种方法去写,第一种比较简单,直接利用QSystemTrayIcon ,来达到一些基本的托盘程序,也是本文章要讲的。第二种是继承QSystemTrayIcon类,这样子类设计可以使得托盘程序更加功能强大,接下来给大家讲解简单的托盘。

二、主要代码

重写了closeEvent()函数,我们点击关闭按钮时候执行了里面的closeEvent()函数hide(),这样窗口就不会关闭了。托盘菜单的退出才是真的调用quit()关闭整个程序。直接在窗口类中增加以下代码:

.h头文件增加:

    /
    //托盘相关开始,添加成员及成员函数
    /
private:
    QMenu *trayMenu;//托盘菜单
    QSystemTrayIcon *tray;//托盘图标添加成员
    void InitTray();
protected:
    void closeEvent(QCloseEvent *event);// 重写申明
    void hideEvent(QHideEvent *event);// 重写申明
private slots:
    void iconActivated(QSystemTrayIcon::ActivationReason ireason);
    /
    //托盘相关结束
    /

.cpp实现文件增加

/
//托盘相关开始,添加成员及成员函数
/
//构造函数初始化
void DlgStudent::InitTray()
{
    //***托盘***
    tray= new QSystemTrayIcon(this);//初始化托盘对象tray
    //tray->setIcon(QIcon(QPixmap(":/images/logo.ico")));//设定托盘图标,引号内是自定义的png图片路径
    //tray->setIcon(QIcon(":/images/logo.ico"));//设定托盘图标,引号内是自定义的png图片路径
    tray->setIcon(qApp->windowIcon());//设定托盘图标,引号内是自定义的png图片路径
    tray->setToolTip(qApp->applicationName());//托盘时鼠标悬停提示文字
    QString title="上机提示";
    QString text="请填写并提交上机信息";
    tray->show();//让托盘图标显示在系统托盘上
    tray->showMessage(title,text,QSystemTrayIcon::Information,3000); //最后一个参数为提示时长,默认10000,即10s

    //创建菜单项动作
    QAction* minimizeAction = new QAction("窗口最小化", this);
    connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide()));
    QAction* maximizeAction = new QAction("窗口最大化", this);
    connect(maximizeAction, SIGNAL(triggered()), this, SLOT(showMaximized()));
    QAction* restoreAction = new QAction("恢复原始大小", this);
    connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));
    QAction* quitAction = new QAction("退出", this);
    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); //关闭应用

    //创建托盘菜单
    trayMenu = new QMenu(this);
    trayMenu->addAction(minimizeAction);
    trayMenu->addAction(maximizeAction);
    trayMenu->addAction(restoreAction);
    trayMenu->addSeparator();
    trayMenu->addAction(quitAction);
    tray->setContextMenu(trayMenu);

 connect(tray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
}
//添加槽函数
void DlgStudent::iconActivated(QSystemTrayIcon::ActivationReason ireason)
{
    switch (ireason)
    {
    case QSystemTrayIcon::Trigger:
        //this->showNormal();
        //this->showFullScreen();
        break;
    case QSystemTrayIcon::DoubleClick:
        //this->showNormal();
        this->showFullScreen();
        break;
    case QSystemTrayIcon::MiddleClick:
        break;
    default:
        break;
    }
}
//拦截桌面窗口事件
void DlgStudent::closeEvent(QCloseEvent *event)
{
#ifdef _DEF_TRAY_
    if(tray->isVisible())
    {
        hide(); //隐藏窗口
        tray->showMessage("托盘", "this is your first to get it");
        event->ignore(); //忽略事件
    }
#endif
}
void DlgStudent::hideEvent(QHideEvent *event)
{
#ifdef _DEF_TRAY_
    if(tray->isVisible())
    {
        hide(); //隐藏窗口
        event->ignore(); //忽略事件
    }
#endif
}
/
//托盘相关结束
/

三、完整代码

DlgStudent.h
#ifndef DLGSTUDENT_H
#define DLGSTUDENT_H


/
//托盘相关开始,添加头文件
/
#include <QSystemTrayIcon>  //t托盘类
#include <QDesktopServices> //桌面事件类
#include <QCloseEvent>
/
//托盘相关结束
/

#include <QMainWindow>
#include "chook.h"


namespace Ui {
class DlgStudent;
}

class DlgStudent : public QMainWindow
{
    Q_OBJECT

public:
    explicit DlgStudent(QWidget *parent = 0);
    ~DlgStudent();

public slots:
    void Slot_DlgStudent_Show();//学生页面显示
    void Slot_DlgStudent_Hide();//学生页面隐藏

public:
    int InitDlg();//初始化窗口
    int InitMask();//初始化屏蔽

public:
    CHook m_hook;

private slots:
    void on_pushButton_quit_clicked();

public slots:
    void Slot_loginSuccess();//登录成功,窗体显示

private:
    Ui::DlgStudent *ui;


    /
    //托盘相关开始,添加成员及成员函数
    /
private:
    QMenu *trayMenu;//托盘菜单
    QSystemTrayIcon *tray;//托盘图标添加成员
    void InitTray();
protected:
    void closeEvent(QCloseEvent *event);// 重写申明
    void hideEvent(QHideEvent *event);// 重写申明
private slots:
    void iconActivated(QSystemTrayIcon::ActivationReason ireason);
    /
    //托盘相关结束
    /
    void on_pushButton_submit_studentInfo_clicked();
};

#endif // DLGSTUDENT_H

DlgStudent.cpp

#pragma execution_character_set("utf-8")//解决中文乱码
#include "DlgStudent.h"
#include "QMsgBox.h"
#include "externparameters.h"
#include "ui_DlgStudent.h"

#include <QProcess>
#include <signalctrl.h>

//#define _DEF_TRAY_    //定义托盘

DlgStudent::DlgStudent(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::DlgStudent)
{
    ui->setupUi(this);
#ifdef _DEF_TRAY_
    InitTray();//初始化最小化到托盘
#endif
    InitDlg();
    InitMask();

    //以下为测试代码
    //#define PROCESS_NAME "sscom5.13.1.exe"
    //QString str_app_name = PROCESS_NAME;
    //QByteArray chStrArray = str_app_name.toLocal8Bit();
    //const char* pName = chStrArray.constData();//当前进程名
    //QProcess::startDetached(str_app_name);
}

DlgStudent::~DlgStudent()
{
    delete ui;
}

//学生页面显示
void DlgStudent::Slot_DlgStudent_Show()
{
    this->show();
}

//学生页面隐藏
void DlgStudent::Slot_DlgStudent_Hide()
{
    this->hide();
}

//初始化窗体
int DlgStudent::InitDlg()
{
    ui->menuBar->hide();
    ui->mainToolBar->hide();
    ui->statusBar->hide();
    //Qt::Window: 无论是否有父窗口部件,新窗口部件都是一个窗口,通常有一个窗口边框和一个标题栏
    //Qt::Tool新窗口部件是一个工具(tool)窗口,它通常是一个用于显示工具按钮的小窗口。如果一个工具窗口有父窗口部件,则它将显示在父窗口的部件上面,否则相当于使用了Qt::WindowStaysOnTopHint提示。
    //Qt::FramelessWindowHint产生一个无窗口边框的窗口,此时用户无法移动该窗口和改变它的大小
    //Qt::WindowStaysOnTopHint告知窗口系统,该窗口应该停留在所有其他窗口的上面
    //this->setWindowFlags (Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);//没有标题栏,就是隐藏窗口标题栏、最大化、最小化、关闭按钮,总在最上面的窗口
    //this->setWindowFlags(Qt::Tool | Qt::WindowTitleHint | Qt::WindowStaysOnTopHint);//保留标题,关闭按钮无效,隐藏其他,总在最上面的窗口
    this->setWindowFlags(Qt::WindowTitleHint | Qt::WindowStaysOnTopHint);//保留标题,关闭按钮无效,隐藏其他,总在最上面的窗口
    //this->setWindowIcon(QIcon(":/images/user.ico"));//设置任务栏窗口图标
    return 1;
}

//初始化屏蔽
int DlgStudent::InitMask()
{
    //m_hook.StartHook();
    return 1;
}

void DlgStudent::on_pushButton_quit_clicked()
{
    //m_hook.StopHook();
    this->hide();
    //QApplication* app;
    //app->quit();
}

//登录成功,窗体显示
void DlgStudent::Slot_loginSuccess()
{
    this->showFullScreen();
}

/
//托盘相关开始,添加成员及成员函数
/
//构造函数初始化
void DlgStudent::InitTray()
{
    //***托盘***
    tray= new QSystemTrayIcon(this);//初始化托盘对象tray
    //tray->setIcon(QIcon(QPixmap(":/images/logo.ico")));//设定托盘图标,引号内是自定义的png图片路径
    //tray->setIcon(QIcon(":/images/logo.ico"));//设定托盘图标,引号内是自定义的png图片路径
    tray->setIcon(qApp->windowIcon());//设定托盘图标,引号内是自定义的png图片路径
    tray->setToolTip(qApp->applicationName());//托盘时鼠标悬停提示文字
    QString title="上机提示";
    QString text="请填写并提交上机信息";
    tray->show();//让托盘图标显示在系统托盘上
    tray->showMessage(title,text,QSystemTrayIcon::Information,3000); //最后一个参数为提示时长,默认10000,即10s

    //创建菜单项动作
    QAction* minimizeAction = new QAction("窗口最小化", this);
    connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide()));
    QAction* maximizeAction = new QAction("窗口最大化", this);
    connect(maximizeAction, SIGNAL(triggered()), this, SLOT(showMaximized()));
    QAction* restoreAction = new QAction("恢复原始大小", this);
    connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));
    QAction* quitAction = new QAction("退出", this);
    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); //关闭应用

    //创建托盘菜单
    trayMenu = new QMenu(this);
    trayMenu->addAction(minimizeAction);
    trayMenu->addAction(maximizeAction);
    trayMenu->addAction(restoreAction);
    trayMenu->addSeparator();
    trayMenu->addAction(quitAction);
    tray->setContextMenu(trayMenu);

 connect(tray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
}
//添加槽函数
void DlgStudent::iconActivated(QSystemTrayIcon::ActivationReason ireason)
{
    switch (ireason)
    {
    case QSystemTrayIcon::Trigger:
        //this->showNormal();
        //this->showFullScreen();
        break;
    case QSystemTrayIcon::DoubleClick:
        //this->showNormal();
        this->showFullScreen();
        break;
    case QSystemTrayIcon::MiddleClick:
        break;
    default:
        break;
    }
}
//拦截桌面窗口事件
void DlgStudent::closeEvent(QCloseEvent *event)
{
#ifdef _DEF_TRAY_
    if(tray->isVisible())
    {
        hide(); //隐藏窗口
        tray->showMessage("托盘", "this is your first to get it");
        event->ignore(); //忽略事件
    }
#endif
}
void DlgStudent::hideEvent(QHideEvent *event)
{
#ifdef _DEF_TRAY_
    if(tray->isVisible())
    {
        hide(); //隐藏窗口
        event->ignore(); //忽略事件
    }
#endif
}
/
//托盘相关结束
/

//学生机填写的信息提交
void DlgStudent::on_pushButton_submit_studentInfo_clicked()
{
    StudentInfo studentInfo;
    studentInfo.name = ui->lineEdit_name->text();
    studentInfo.grades = ui->lineEdit_grades->text();
    studentInfo.classes = ui->lineEdit_classes->text();
    if(studentInfo.name.isEmpty()
            ||studentInfo.grades.isEmpty()
            ||studentInfo.classes.isEmpty())
    {
        QMsgBox::warning("警告", "信息不可为空!",  QMessageBox::Ok);
        return;
    }
    SignalCtrl::getInstance()->Slot_ServerCtrl_StudentInfo(studentInfo);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1108869.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java开发树结构数据封装!

目录 源数据如下controller接口&#xff1a;service层封装:Dao接口&#xff1a;Dao层Mapper:映射实体类&#xff1a; 源数据如下 controller接口&#xff1a; RequestMapping("/UserTreeInfo")public RespBody getUserTreeInfo(Long userId) {List<MenuTreeVo>…

如何使用BERT生成单词嵌入?

阿比贾特萨拉里 一、说明 BERT&#xff0c;或来自变形金刚&#xff08;Transformer&#xff09;的双向编码器表示&#xff0c;是由谷歌开发的强大语言模型。它已广泛用于自然语言处理任务&#xff0c;例如情感分析、文本分类和命名实体识别。BERT的主要特征之一是它能够生成单词…

python中不可变类型和可变类型

不可变类型&#xff1a;修改之后内存存储地址不会发生改变 可变类型&#xff1a;修改之后内存存储地址发生改变 set

chromium线程模型(2)-线程池实现

通过chromium 官方文档&#xff0c;线程和任务一节我们可以知道 &#xff0c;chromium有两类线程&#xff0c;一类是普通线程&#xff0c;最典型的就是io线程和ui线程。 另一类是 线程池线程。 今天我们先分析线程池的实现&#xff08;基于版本 117.0.5847.0&#xff08;开发者…

python小游戏:飞机射击游戏代码

创建一个完整的飞行游戏涉及到许多方面&#xff0c;包括图形设计、游戏物理引擎和用户输入处理等。在这里&#xff0c;我将提供一个简单的基础框架&#xff0c;你可以在其基础上进一步扩展和完善游戏。 在这个示例中&#xff0c;我们将使用Pygame库来创建一个基本的飞行游戏。…

端点管理软件

在各公司管理中心&#xff0c;端点管理软件发挥着举足轻重的作用&#xff0c;那么&#xff0c;究竟什么是端点管理软件&#xff1f;它的意义和具体应用场景又是什么&#xff1f; 端点管理软件是什么 端点管理软件是一种计算机安全管理工具&#xff0c;负责对网络中的终端设备进…

OceanBase自动安装部署演示环境demo

OceanBase自动安装部署 前提条件 官方给出硬件条件需要满足以下要求 本文操作系统为&#xff1a;Red Hat Enterprise Linux 8 64 位 下载链接&#xff1a;https://pan.baidu.com/s/1rZ39xJFhk0HdmC4wEJcxvg 提取码&#xff1a;c01x 下载并安装 all-in-one 安装包 执行如下…

RK3588开发笔记(二):基于方案商提供sdk搭建引入mpp和sdk的宿主机交叉编译Qt5.12.10环境

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133915614 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

linux 防火墙介绍以及iptables的使用

背景介绍 在前几天&#xff0c;于工发现我们内部的150服务器7554端口被外网访问了。该应用提供着内部的摄像头资源。为了避免被入侵&#xff0c;于是我添加了一些iptables规则&#xff0c;防止外网的访问。 解决方式 解决方式有两种&#xff1a; 关闭公司公网路由器对150服务…

跑得“快”还要走得“稳”,看头部车企数字化实践怎么做

立足于人工智能、大数据、云计算等各种新技术变革的交汇点&#xff0c;无论是造车新势力还是传统车企&#xff0c;都在积极构建全链条、全流程数字化生态圈。在看得见的产品智能化、功能自动化之下&#xff0c;车企自身的数字化能力建设&#xff0c;则成为影响竞争格局的一条秘…

linux uboot kenerl filesystem关系

每次烧写都是uboot&#xff0c;image&#xff0c;roots&#xff0c;为什么不整一套&#xff0c;为什么分开 什么是uboot 什么是内核&#xff0c;三者为什么分开 如果你上网去搜一下&#xff0c;你会发现这样的答案 另注&#xff1a;本文含有大量的错误和意测成份&#xff0c…

【脉冲通信】用于空间应用的飞秒脉冲通信的符号误码率模型研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

超声波清洗机有没有平价又好用的推荐、平价好用超声波清洗机总结

超声波清洗机以其高效、环保、节能等优点在日常生活中得到了广泛应用。无论是在珠宝首饰、眼镜等小物品的清洁方面&#xff0c;还是在医疗领域的清洁消毒方面&#xff0c;超声波清洗机都发挥着不可替代的作用。在购买超声波清洗机时&#xff0c;需要根据自己的具体需求选择合适…

“创新启变 聚焦增长”极狐(GitLab)媒体沟通会,共话智能时代软件开发新生态

10 月 18 日 北京 昨日&#xff0c;全球领先 AI 赋能 DevSecOps 一体化平台极狐(GitLab) 在北京举办了主题为“创新启变 聚焦增长”的媒体沟通会。极狐(GitLab) CEO 柳钢就“中国企业数字化转型、软件研发、技术自主可控等热点问题&#xff0c;以及 AI 大模型时代下&#xff0c…

逐字稿 | 2 MoCo 论文逐段精读【论文精读】

bryanyzhu的个人空间-bryanyzhu个人主页-哔哩哔哩视频 评价 今天我们一起来读一下 MOCO 这篇论文。 MOCO 是 CVPR 2020 的最佳论文提名&#xff0c;算是视觉领域里使用对比学习的一个里程碑式的工作。而对比学习作为从 19 年开始一直到现在视觉领域乃至整个机器学习领域里最炙…

数据可视化素材分享 | 数十图表、无数模板

很多人在后台求分享报表、源代码&#xff0c;其实何必这么麻烦&#xff0c;在奥威BI数据可视化平台上点击即可获得大量的可视化素材&#xff0c;如数十种可视化图表&#xff0c;适用于不同分析场景&#xff1b;又如大量不同主题的BI数据可视化报表模板&#xff0c;套用后替换数…

JAVA性能优化:n个小细节让你提升java代码的运行效率

目录 1、尽量指定类、方法的final修饰符 2、尽量重用对象 3、尽可能使用局部变量 4、及时关闭流 5、尽量减少对变量的重复计算 6、尽量采用懒加载的策略&#xff0c;即在需要的时候才创建 7、慎用异常 8、不要在循环中使用try…catch…&#xff0c;应该把其放在最外层 …

神经网络量化----为了部署而特别设计

引言&#xff1a;一般神经网络量化有两个目的&#xff1a; 为了加速&#xff0c;在某些平台上浮点数计算比较耗费时间&#xff0c;替换为整形可以加快运算为了部署&#xff0c;某些平台上只支持整形运算&#xff0c;比如在芯片中 如果是第1个目的&#xff0c;则使用常规的量化手…

在线课堂分销商城小程序源码系统 带完整搭建教程

大家好啊&#xff0c;今天来给大家分享一个在线课堂分销商城小程序源码系统&#xff0c;一起来看看吧。以下是部分功能实现的核心代码&#xff1a; 系统特色功能一览&#xff1a; 商品模块。包括实物商品、虚拟商品和电子卡密等&#xff0c;每种商品可以设置对应的商品分类。同…

购药不烦恼:线上购药小程序的快捷方式

在这个数字化时代&#xff0c;线上购药小程序的快捷方式正在改变着我们购药的方式。本文将介绍如何通过使用Python和Flask框架创建一个简单的线上购药小程序的原型&#xff0c;为用户提供购药的便利和快捷体验。 安装和设置 首先&#xff0c;确保你已经安装了Python和Flask。…