Qt最小化到托盘

https://blog.csdn.net/qq_16542775/article/details/86293180

main.cpp

#include <QtGui>
#include "mwin.h"
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
//***三行编码设置,保证中文字符***
//本机电脑是UTF-8编码,其他电脑自行调试修改编码
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
MWin *win=new MWin();
win->show();
return app.exec();
}

mwin.h

#ifndef MWIN_H
#define MWIN_H
#include <QWidget>
#include <QtGui>
class MWin : public QWidget
{
Q_OBJECT
public:
explicit MWin(QWidget *parent = 0);
void init();//初始化函数
QSystemTrayIcon *tray;//托盘图标
QMenu *menu;//托盘菜单
QAction *reset;//菜单实现功能:恢复窗口
QAction *quit;//菜单实现功能:退出程序
protected:
void closeEvent(QCloseEvent *event);//由于要关闭窗口变为隐藏至托盘图标,所以要重写close事件
signals:
public slots:
void TrayIconAction(QSystemTrayIcon::ActivationReason reason);//对托盘图标操作的槽:本代码实现单机图标恢复窗口功能
};
#endif // MWIN_H

mwin.cpp

#include "mwin.h"
MWin::MWin( QWidget *parent ) :
QWidget( parent )
{
init(); /* 初始化 */
}
void MWin::init()
{
/****主窗口****/
this->setFixedSize( 200, 200 );
this->setWindowTitle( "托盘APP" );
/****托盘*** */
tray = new QSystemTrayIcon( this ); /* 初始化托盘对象tray */
tray->setIcon( QIcon( QPixmap( ":/image/ico.png" ) ) ); /* 设定托盘图标,引号内是自定义的png图片路径 */
tray->show(); /* 让托盘图标显示在系统托盘上 */
QObject::connect( tray, SIGNAL( activated( QSystemTrayIcon::ActivationReason ) ), this, SLOT( TrayIconAction( QSystemTrayIcon::ActivationReason ) ) ); /* 连接信号与槽,实现单击图标恢复窗口的功能,槽是自定义的槽 */
/****初始化托盘菜单及功能****/
menu = new QMenu( this ); /* 初始化菜单 */
reset = new QAction( this ); /* 初始化恢复窗口 */
reset->setText( "显示窗口" );
QObject::connect( reset, SIGNAL( triggered() ), this, SLOT( showNormal() ) ); /* 菜单中的显示窗口,单击连接显示窗口 */
quit = new QAction( this ); /* 初始化退出程序 */
quit->setText( "退出程序" );
QObject::connect( quit, SIGNAL( triggered() ), qApp, SLOT( quit() ) ); /* 菜单中的退出程序,单击连接退出</span> */
/*
* qApp,是Qt自带的demo中的知识点,查了一下文档,qApp是Qt中所有app的指针,关闭它就可以关闭当前的程序
* 之所以不用this,close(),是由于软件要求关闭改为最小化到托盘,所以close()的功能已经不再是关闭窗口的功能,所以要另寻方法
* 将定义好的菜单加入托盘的菜单模块中
*/
tray->setContextMenu( menu );
menu->addAction( reset );
menu->addAction( quit );
}
/* ***重置关闭close()*** */
void MWin::closeEvent( QCloseEvent *event )
{
hide(); /* 隐藏窗口 */
event->ignore(); /* 忽略关闭事件 */
}
/*
* 因为实现的是关闭窗口至系统托盘,所以我们先将窗口hide()隐藏,再忽略关闭窗口功能event->ignore()即可。
* ***托盘图标槽***
*/
void MWin::TrayIconAction( QSystemTrayIcon::ActivationReason reason )
/* 参数是Qt的保留字,表示对托盘图标的操作,该槽函数功能只实现了单击功能,可以实现其他功能比如双击、中击,具体可查文档或者Qt自带demo(关键字tray) */
{
if ( reason == QSystemTrayIcon::Trigger )
this->showNormal(); /* 如果对图标进行单击,则显示正常大小的窗口 */
}
posted @   看不见的R  阅读(542)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示