Qt应用程序退出到系统托盘

弹出询问框是否退出到系统托盘

现在很多软件都是退出以后在系统托盘后台挂起,我们也来实现一下
用到了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年菜鸡一枚,还望大佬们多多指教!

猜你喜欢

转载自blog.csdn.net/weixin_42837024/article/details/81451618