作为Qt初学者,最近在编写窗口最小化到托盘功能代码的时候遇到了点阻碍。
Qt自带的demo实现的功能太过繁琐,涉及知识点又太杂,很难理出最核心的思路。网上的文章代码也很多脱骨于这个demo,注释说明太少。
所以自己对比了Qt的demo和网上的文章,自己写了个简单的最小化到系统托盘的功能。
先看一下代码的实现功能:
1.空白窗口,关闭叉叉不会关闭窗口,而是最小化到托盘
2.系统托盘,单击恢复隐藏窗口
3.系统托盘,右击出现菜单,菜单有两个选项:恢复窗口、关闭程序
再看一下源代码(由于功能简单,所以很多模块功能就没有单独编写函数,都直接写在了初始化函数中)
头文件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()
//***主窗口***</span>
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的指针,关闭它就可以关闭当前的程序</span>
//之所以不用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();//如果对图标进行单击,则显示正常大小的窗口
}
主函数调用测试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();
}