弹出询问框是否退出到系统托盘
现在很多软件都是退出以后在系统托盘后台挂起,我们也来实现一下
用到了Qt的类 QSystemTrayIcon
The QSystemTrayIcon class provides an icon for an application in the system tray.
Modern operating systems usually provide a special area on the desktop, called the system tray or notification area, where long-running applications can display icons and short messages.
//下面这些都是QSystemTrayIcon 的共有方法 我们用到了
setContextMenu(QMenu* menu) //设置托盘菜单
SetIcon(const QIcon &icon) //设置托盘图标
Public Functions
QSystemTrayIcon(QObject *parent = Q_NULLPTR)
QSystemTrayIcon(const QIcon &icon, QObject *parent = Q_NULLPTR)
~QSystemTrayIcon()
QMenu *
contextMenu() const
QRect
geometry() const
QIcon
icon() const
bool
isVisible() const
void
setContextMenu(QMenu *menu)
void
setIcon(const QIcon &icon)
void
setToolTip(const QString &tip)
QString
toolTip() const
QSystemTrayIcon类在系统托盘中为应用程序提供一个图标。
现代操作系统通常在桌面上提供一个特殊的区域,称为系统托盘或通知区,在那里长时间运行的应用程序可以显示图标和短消息。
先来看效果图:
任务栏上和桌面上已经消失了,已经成功退出到系统托盘了,下面上代码
widget.cpp
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSystemTrayIcon>
#include "closedialog.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void closeEvent(QCloseEvent *event);
public slots:
void TrayIconAction(QSystemTrayIcon::ActivationReason reason);
void restory();
void initUI();
void Tray();
private:
Ui::Widget *ui;
QSystemTrayIcon* m_tray; //托盘类
QMenu* m_menu; //托盘菜单
QAction* m_resetAction; //托盘按钮
QAction* m_quitAction; //托盘按钮
closeDialog* m_closeDialog; //关闭时询问的窗口
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QMenu>
#include <QDebug>
#include <QCloseEvent>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
initUI();
}
Widget::~Widget()
{
delete ui;
}
void Widget::closeEvent(QCloseEvent *event)
{
m_closeDialog->show();
event->ignore();
}
void Widget::TrayIconAction(QSystemTrayIcon::ActivationReason reason)
{
if(reason == QSystemTrayIcon::Trigger)
this->showNormal();
}
void Widget::restory()
{
this->showNormal();
}
void Widget::initUI()
{
this->setWindowTitle("码农小明->test托盘");
QPixmap m_logo(":/music.png");
setWindowIcon(QIcon(m_logo));
m_closeDialog = new closeDialog(this);
m_tray = new QSystemTrayIcon(this);//实例化
m_tray->setIcon(QIcon(m_logo));//设置图标
m_tray->show();
connect(m_tray,&QSystemTrayIcon::activated,this,&Widget::TrayIconAction);
m_menu = new QMenu(this);
m_resetAction = new QAction(this);
m_resetAction->setText("show");
m_quitAction = new QAction(this);
m_resetAction->setIcon(QIcon(m_logo));
m_quitAction->setText("quit");
m_quitAction->setIcon(QIcon(m_logo));
connect(m_quitAction,&QAction::triggered,qApp,&QApplication::quit);
connect(m_resetAction,&QAction::triggered,this,&Widget::restory);
connect(m_closeDialog,&closeDialog::traySiganal,this,&Widget::Tray);
m_tray->setContextMenu(m_menu);//设置托盘菜单
m_menu->addAction(m_resetAction);
m_menu->addAction(m_quitAction);
}
void Widget::Tray()
{
this->hide();
}
closeDialog.h
#ifndef CLOSEDIALOG_H
#define CLOSEDIALOG_H
#include <QDialog>
namespace Ui {
class closeDialog;
}
class closeDialog : public QDialog
{
Q_OBJECT
public:
explicit closeDialog(QWidget *parent = 0);
~closeDialog();
signals:
void traySiganal();
private slots:
void on_quitButton_clicked();
void on_yesButton_clicked();
private:
Ui::closeDialog *ui;
};
#endif // CLOSEDIALOG_H
closeDialog.cpp
#include "closedialog.h"
#include "ui_closedialog.h"
closeDialog::closeDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::closeDialog)
{
ui->setupUi(this);
}
closeDialog::~closeDialog()
{
delete ui;
}
void closeDialog::on_quitButton_clicked()
{
qApp->quit();
}
void closeDialog::on_yesButton_clicked()
{
emit traySiganal();
this->hide();
}
来着98年菜鸡一枚,还望大佬们多多指教!