QT最小化到托盘显示

一、效果:

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

        那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_OBJECTpublic: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();//初始化最小化到托盘
#endifInitDlg();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.mzph.cn/news/109150.shtml

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

相关文章

2023.10.17 关于 wait 和 notify 的使用

目录 引言 方法的使用 引入实例&#xff08;wait 不带参数版本&#xff09; wait 方法执行流程 wait 和 notify 组合实例 wait 带参数版本 notify 和 notifyAll 的区别 经典例题 总结 引言 线程最大的问题是抢占式执行&#xff0c;随机调度虽然线程在内核里的调度是随…

【前端学习】—JS判断数据类型的方式有哪些(八)

【前端学习】—JS判断数据类型的方式有哪些&#xff08;八&#xff09; 一、JS中判断数据类型的场景 二、JS中有哪些数据类型 三、JS判断数据类型的方式有哪些 const arr[]; const object{};const number1; const stringstring;//typeofconst typetypeof arr; console.log(type…

从头开始机器学习:神经网络

一、说明 如果你还没有做过逻辑回归&#xff0c;你会在这里挣扎。我强烈建议在开始之前查看它。您在逻辑回归方面的能力将影响您学习神经网络的难易程度和速度。 二、神经网络简介 神经网络是一个神经元网络。这些神经元是逻辑回归函数&#xff0c;它们被链接在一起形成一个网络…

只会Python,怎么用PC控制无人机自动飞行?

PC-SDK是阿木实验室 (AMOVLAB) 为了简化开源飞控的控制协议MAVLink&#xff0c;优化和维护的一个基于PC电脑运行MAVSDK(支持Windows和Ubuntu)的Python SDK库。 相对于传统的无人机控制开发&#xff0c;开发者无需掌握C/C语言和ROS等相关知识&#xff0c;只要学会Python编程及懂…

leetcode 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…

wsl使用vscode连接,远程安装C/C++ 拓展时,报错

报错内容&#xff1a; EACCES: permission denied, rename /home/wen/.vscode-server/extensions/.b61b1c7c-f703-4dfd-bdc5-d9a00681c4b7 -> /home/wen/.vscode-server/extensions/ms-vscode.cpptools-1.17.5-linux-x64 解决办法&#xff1a; 升级wsl到wsl2就好了。 &a…

Vue-router快速入门 是什么 如何跳转 如何传值的问题

3.1 Vue-router是什么 Vue-router:Vue.js 的官方路由为 Vue.js 提供富有表现力、可配置的、方便的路由 官网&#xff1a;https://router.vuejs.org/zh/ 作用&#xff1a; 1.实现vue页面(组件)的跳转 2.可以在跳转的时候携带参数 3.2 Vue3使用Vue-router(静态路由) 基于Vu…

C# CodeFormer Inpainting 人脸填充

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace CodeFormer_D…

UnitTesting 单元测试

1. 测试分为两种及详细介绍测试书籍: 1.1 Unit Test : 单元测试 - test the business logic in your app : 测试应用中的业务逻辑 1.2 UI Test : 界面测试 - test the UI of your app : 测试应用中的界面 1.3 测试书籍网址:《Testing Swift》 https://www.hackingwithswift.c…

MySQL——六、库表操作(下篇)

MySQL 一、INSERT语句二、REPLACE语句三、UPDATE语句四、delete和TRUNCATE语句五、MySQL用户授权1、密码策略2、用户授权和撤销授权 一、INSERT语句 #在表里面插入数据&#xff1a;默认情况下&#xff0c;一次插入操作只插入一行 方式1&#xff1a; INSERT [INTO] 表名 [(colu…

uni-app小程序使用DCloud(插件市场)流程

一、DCloud&#xff08;插件市场&#xff09; DCloud 是uni-app官方插件市场&#xff0c;里面有官方、团队、个人发布的众多插件&#xff0c;包括uni-ui、uni-pay 等。而像uni-ui这种大型组件库都有官方文档可参考&#xff0c;但一些团队或个人发布的小型插件没有文档&#xf…

垃圾回收器、垃圾回收算法、空间分配担保、JVM调优、GC回收对象的过程

文章目录 &#x1f34a; 垃圾回收器、垃圾回收算法、空间分配担保&#x1f389; Serial&#x1f389; ParNew&#x1f389; Parallel scavenge&#x1f389; 复制算法&#x1f389; 分代收集算法&#x1f389; 进入老年代的几种情况&#x1f4dd; 空间分配担保 &#x1f389; S…

超火的双臂烹饪机器人Project YORI,分分钟成为你的专属大厨!

原创 | 文 BFT机器人 当前行业内有两种通用的烹饪自动化方法&#xff1a;一种是“制造一个可以在普通厨房中运作的烹饪机器人&#xff0c;因为每个人都有厨房”&#xff0c;这听起来很不错&#xff0c;但接下来你就必须使你的烹饪机器人能够在厨房环境中正常运行&#xff0c;这…

docker 复习

文章目录 1. docker 基础1.1 docker 安装配置镜像加速器拉取镜像的仓库&#xff1a; docker 部署Mysql 镜像docker 命令的详细解释docker 常见命令docker 数据卷docker 相关命令总结 2.自定义镜像2.1 dockerfile2.2 try 构建一个Java镜像&#xff0c;并部署2.3 总结: 3. docker…

物流监管:智慧仓储数据可视化监控平台

随着市场竞争加剧和市场需求的不断提高&#xff0c;企业亟需更加高效、智能且可靠的仓储物流管理方式&#xff0c;以提升企业的物流效率&#xff0c;减少其输出成本&#xff0c;有效应对市场上的变化和挑战。 图扑自研 HT for Web 产品搭建的 2D 智慧仓储可视化平台&#xff0c…

Databend 开源周报第 115 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 聚合索引 Data…

[计算机提升] 系统及用户操作

1.4 系统及用户操作 1.4.1 系统操作 1.4.1.1 开机、关机、重启 在Windows系统中&#xff0c;开机&#xff08;Power On&#xff09;&#xff0c;关机&#xff08;Shutdown&#xff09;和重启&#xff08;Restart&#xff09;是指计算机的不同电源控制操作。 开机&#xff1a;…

苹果平板可以用别的电容笔吗?电容笔和Apple pencil区别

和苹果原装的Pencil相比&#xff0c;这种平替的电容笔并没具备重力压感&#xff0c;只有一种倾斜的压感功能。如果你不经常用来作画&#xff0c;一支普通的电容笔就足够了。不管是用来记笔记&#xff0c;还是用来解决一些数学问题&#xff0c;都能用得上。再说了&#xff0c;即…

NAND存储器转储分析 - 使用ECC修复位错误与UBI镜像固件分析

一、 简介 这篇研究论文将通过黑客的视角&#xff0c;详细阐述如何操作 NAND dump 以及如何获取 dump 文件中的所有文件。每一步骤以及所使用的方法均会细致解析&#xff0c;并配以实例说明。本文主要关注的是物理 NAND dump&#xff0c;这是从通用编程器中提取出的 dump 文件…

项目平台——测试报告的实现(七)

这里写目录标题 一、Table表格组件的使用1、Table表格组件中的插槽使用 二、点击查看测试报告&#xff0c;跳转到测试报告详情页实现1、新建Report.vue组件2、配置路由3、查看报告按钮添加事件 三、页面布局1、Layout布局2、卡片设计3、打开页面发送请求加载报告数据4、对接口进…