将应用程序缩小到右下角任务栏的系统托盘内 - C/C++进阶之Qt图形UI库
简述初尝QT不甚欢喜,鱼C上有许多的朋友在为QT做出贡献,我也愿意以主观角度来分享QT,让QT变得更好。
该源码系作者个人撰写,使用时请尊重作者,不要随意篡改关于作者的信息。
版权所有:CSND_Ayo,转载请注明出处:http://blog.csdn.net/csnd_ayo
帖子原址:http://blog.csdn.net/csnd_ayo/article/details/56004234
源码
#ifndef CUSTOMSYSTEMTRAYICON_H
#define CUSTOMSYSTEMTRAYICON_H
#include <QSystemTrayIcon>
#include <QWidget>
/*
* 自定义系统托盘类
* 作者:陈鲁勇
* 邮箱:727057301@qq.com
* 创建时间:2017年2月10日16:26:48
* QT版本:5.0.2
* CSDN:http://blog.csdn.net/csnd_ayo
* **************************************
* 说明:
* 第一次使用instance时必须传入主窗口的指针
* 以保证托盘与程序相关联,使用前请确保在QT.pro中加入 C++11 的支持
*
* 示例代码:
icon_ = CustomSystemTrayIcon::instance(this);
icon_->setTray("托盘名字","托盘图标资源地址",
"托盘描述");
// 显示托盘
icon_->showTray();
// 隐藏托盘
//icon_->hideTray();
*/
class QAction;
class QMenu;
class CustomSystemTrayIcon : public QWidget
{
Q_OBJECT
public:
// 得到系统托盘实例
static CustomSystemTrayIcon* instance(QWidget* _this = nullptr);
/*
* 设置托盘
* 参数 _name:托盘标题
* 参数 _icon:托盘图标
* 参数 _describe:托盘描述
*
图标建议大小 20~40
*/
void setTray(const QString& _name,
const QString& _icon,
const QString& _describe);
void setTray(const QString& _name,
const QString& _icon);
void setTray(const QString& _name);
// 显示托盘
void showTray(void);
// 隐藏托盘
void hideTray(void);
private:
explicit CustomSystemTrayIcon(QWidget *parent = 0);
// 初始化
void init(void);
// 初始化右键菜单
void initMenu(void);
// 初始化托盘
void initTray(void);
// 初始化信号
void initSignal(void);
private slots:
/*
* 托盘点击事件
* 参数 _action:具体的事件行为宏
*/
void trayActivatedEvent(QSystemTrayIcon::ActivationReason _action);
protected:
// 托盘描述内容
QString trayDescribe_;
private:
// 隐藏按钮(菜单)
QAction* hideAction_ = nullptr;
// 还原按钮(菜单)
QAction* restoreAction_ = nullptr;
// 退出按钮(菜单)
QAction* quitAction_ = nullptr;
// 根菜单
QMenu* menu_ = nullptr;
// 托盘实例
QSystemTrayIcon* trayObject_ = nullptr;
// 实例
static CustomSystemTrayIcon* self_;
};
#endif // CUSTOMSYSTEMTRAYICON_H
#include <QApplication>
#include <QtGui>
#include <QMenu>
#include <QAction>
#ifndef QT_NO_DEBUG
#include <QMessageBox>
#endif
#include "customsystemtrayicon.h"
CustomSystemTrayIcon* CustomSystemTrayIcon::self_ = nullptr;
CustomSystemTrayIcon::CustomSystemTrayIcon(QWidget *parent)
: QWidget(parent) {
init();
}
void CustomSystemTrayIcon::setTray(const QString &_name,
const QString &_icon,
const QString &_describe) {
setTray(_name,_icon);
trayDescribe_ = _describe;
}
void CustomSystemTrayIcon::setTray(const QString &_name,
const QString &_icon) {
setTray(_name);
trayObject_->setIcon(QIcon(_icon));
}
void CustomSystemTrayIcon::setTray(const QString &_name) {
trayObject_->setToolTip(_name);
}
void CustomSystemTrayIcon::showTray()
{
trayObject_->show();
trayObject_->showMessage(trayObject_->toolTip(),trayDescribe_,
QSystemTrayIcon::Information, 5000);
}
void CustomSystemTrayIcon::hideTray()
{
trayObject_->hide();
}
CustomSystemTrayIcon* CustomSystemTrayIcon::instance(QWidget *_this)
{
if (self_ == nullptr) {
if (_this != nullptr) {
self_ = new CustomSystemTrayIcon(_this);
}
else {
#ifndef QT_NO_DEBUG
QMessageBox::critical(nullptr,
"警告","不符合要求的托盘操作代码");
#endif
return nullptr;
}
}
return self_;
}
void CustomSystemTrayIcon::trayActivatedEvent(
QSystemTrayIcon::ActivationReason _action) {
switch(_action)
{
case QSystemTrayIcon::Unknown:
trayObject_->showMessage(trayObject_->toolTip(),trayDescribe_,
QSystemTrayIcon::Information, 5000);
break;
// 右键单击
case QSystemTrayIcon::Context:
break;
// 点击
case QSystemTrayIcon::Trigger:
break;
// 双击
case QSystemTrayIcon::DoubleClick:
this->parentWidget()->showNormal();
break;
// 中键点击
case QSystemTrayIcon::MiddleClick:
this->parentWidget()->hide();
break;
default:
break;
}
}
void CustomSystemTrayIcon::init() {
//判断系统是否支持系统托盘图标
if (!QSystemTrayIcon::isSystemTrayAvailable()) {
#ifndef QT_NO_DEBUG
QMessageBox::critical(nullptr,
"警告","当前系统不支持系统托盘");
#endif
return;
}
// 托盘对象
trayObject_ = new QSystemTrayIcon(this);
// 隐藏按钮(菜单)
hideAction_ = new QAction("隐 藏(&Z)",this);
// 还原按钮(菜单)
restoreAction_ = new QAction("还 原(&X)",this);
// 退出按钮(菜单)
quitAction_ = new QAction("退 出(&C)",this);
// 根菜单
menu_ = new QMenu((QWidget*)QApplication::desktop());
initMenu();
initTray();
initSignal();
}
void CustomSystemTrayIcon::initMenu()
{
// 设置菜单图标
// hideAction_->setIcon(QIcon(":/icon/hide"));
// restoreAction_->setIcon(QIcon(":/icon/restore"));
// quitAction_->setIcon(QIcon(":/icon/quit"));
// 组织菜单顺序
menu_->addAction(hideAction_);
menu_->addAction(restoreAction_);
//加入一个分离符
menu_->addSeparator();
menu_->addAction(quitAction_);
}
void CustomSystemTrayIcon::initTray()
{
trayObject_->setIcon(QIcon(":/icon/logo")); //设置图标图片
//setWindowIcon(QIcon(":/ic/logo"));//把图片设置到窗口上
trayObject_->setToolTip("LuYong Chen"); //托盘时,鼠标放上去的提示信息
trayObject_->showMessage("LuYong Chen","QQ:727057301",QSystemTrayIcon::Information,10000);
// 设置托盘右键菜单
trayObject_->setContextMenu(menu_);
trayObject_->hide();
}
void CustomSystemTrayIcon::initSignal()
{
// 菜单项功能关联
connect(hideAction_,SIGNAL(triggered()),
parentWidget(),SLOT(hide()));
connect(restoreAction_,SIGNAL(triggered()),
parentWidget(),SLOT(showNormal()));
connect(quitAction_,SIGNAL(triggered()),
qApp,SLOT(quit()));
// 托盘激活事件(点击、双击、滚轮点击)
connect(trayObject_,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
this,SLOT(trayActivatedEvent(QSystemTrayIcon::ActivationReason)));
}
页:
[1]