Qt实现windows系统托盘例子

转载自:http://www.qtcn.org/bbs/read-htm-tid-85563.html,感谢原作者分享

#ifndef WIDGET_H
#define WIDGET_H

#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
    QSystemTrayIcon tray;
    void closeEvent(QCloseEvent *event);
    void initTray();
};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle(qApp->applicationDisplayName());
    initTray();
    tray.show();
    tray.showMessage(u8"欢迎",u8"程序已启动");
}

Widget::~Widget(){
    delete ui;
}

void Widget::closeEvent(QCloseEvent *event){
    event->ignore();
    hide();
}

void Widget::initTray(){
    //先添加一个资源文件,放入 logo
    connect(&tray,&QSystemTrayIcon::activated,this,[&](QSystemTrayIcon::ActivationReason reason){
        switch(reason){
        case QSystemTrayIcon::Trigger:
        case QSystemTrayIcon::DoubleClick:
        case QSystemTrayIcon::MiddleClick:
            if(isHidden()){
                show();
                activateWindow();
            }else hide();
        }
    });
    auto menu = new QMenu(this);
    connect(menu->addAction(u8"退出程序"),&QAction::triggered,this,[&]{
        QMessageBox about(QMessageBox::NoIcon,windowTitle(),u8"
您确定要退出程式吗?
",QMessageBox::Ok|QMessageBox::Cancel,this); about.setIconPixmap(QPixmap(":/logo.png")); if(about.exec()==QMessageBox::Cancel)return; qApp->quit();//退出程序 }); tray.setContextMenu(menu); tray.setToolTip(qApp->applicationDisplayName()); tray.setIcon(QIcon(":/logo.png")); }

运行效果:

Qt实现windows系统托盘例子_第1张图片

你可能感兴趣的:(Qt)