qt 之 QSystemTrayIcon(托盘程序整个例子)

       小伙伴们会经常遇到一些托盘程序,有些程序关闭后,程序并没有退出,而是放入了托盘中,如下图:

       那qt是如何实现这样的办法呢,其实就是用到了 QSystemTrayIcon类,通常有两种方法去写,第一种比较简单,直接利用

QSystemTrayIcon ,来达到一些基本的托盘程序,也是本文章要讲的。第二种是继承QSystemTrayIcon类,这样子类设计可以使得托

盘程序更加功能强大,接下来给大家讲解简单的托盘:

       

qt 之 QSystemTrayIcon(托盘程序整个例子)_第1张图片

 

托盘也出现了程序:

qt 之 QSystemTrayIcon(托盘程序整个例子)_第2张图片

 

当我们关闭程序时候,

qt 之 QSystemTrayIcon(托盘程序整个例子)_第3张图片

弹出了消息框,程序没有退出,在托盘依旧可以找到它,并且右击出现菜单:

qt 之 QSystemTrayIcon(托盘程序整个例子)_第4张图片

点击恢复原来样子,或者双击托盘图标,可以恢复程序原来的位置;

下面我们来看代码部分:

对应的头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include 
#include  //托盘使用的头文件

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    QSystemTrayIcon *SysIcon;
    QAction *min; //最小化
    QAction *max; //最大化
    QAction *restor; //恢复
    QAction *quit; //退出
    QMenu *menu;
private:
    void closeEvent(QCloseEvent * event);
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();



private slots:
    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 

 重写了closeEvent()函数,自定义了一个action函数:

对应的cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    menu = new QMenu(this);
    QIcon icon(":/images/images/QtIcon.ico");
    SysIcon = new QSystemTrayIcon(this);
    SysIcon->setIcon(icon);
    SysIcon->setToolTip("Qt托盘");
    min = new QAction("窗口最小化",this);
    connect(min,&QAction::triggered,this,&MainWindow::hide);
 //   connect(min,SIGNAL(trigger()),this,&MainWindow::hide);
    max = new QAction("窗口最大化",this);
    connect(max,&QAction::triggered,this,&MainWindow::showMaximized);
    restor = new QAction("恢复原来的样子",this);
    connect(restor,&QAction::triggered,this,&MainWindow::showNormal);
    quit = new QAction("退出",this);
//    connect(quit,&QAction::triggered,this,&MainWindow::close);
    connect(quit,&QAction::triggered,qApp,&QApplication::quit);
    connect(SysIcon,&QSystemTrayIcon::activated,this,&MainWindow::on_activatedSysTrayIcon);

    menu->addAction(min);
    menu->addAction(max);
    menu->addAction(restor);
    menu->addSeparator(); //分割
    menu->addAction(quit);
    SysIcon->setContextMenu(menu);
    SysIcon->show();
    close();
}

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

void MainWindow::closeEvent(QCloseEvent * event)
{
   if(SysIcon->isVisible())
   {
       this->hide();
       SysIcon->showMessage("Qt托盘","this is your first to get it");
       event->ignore();
   }
   else {
       event->accept();
   }

}

void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
    switch (reason) {

    case QSystemTrayIcon::Trigger:
        break;
    case QSystemTrayIcon::DoubleClick:
        this->show();
        break;
    default:
        break;

    }
}

qt 之 QSystemTrayIcon(托盘程序整个例子)_第5张图片

程序就是使用QAction 的变量绑定了界面不同的功能,其中:

connect(quit,&QAction::triggered,qApp,&QApplication::quit);

 托盘菜单的退出菜单才是真的关闭整个程序。

 当我们点击关闭按钮时候执行了:

void MainWindow::closeEvent(QCloseEvent * event)
{
   if(SysIcon->isVisible())
   {
       this->hide();
       SysIcon->showMessage("Qt托盘","this is your first to get it");
       event->ignore();
   }
   else {
       event->accept();
   }

}

当托盘还在的时候,界面影藏起来,消息使用ignore,这样窗口就不会关闭了,你学会了吗。

大家可以多想想,还有我们常见的东西,我们一起加油实现出来,让自己变得更加好。

我是比卡丘不皮,喜欢的朋友可以关注我的博客,一起学习,需要demo的同学可以私信我,希望点个赞吧。

 

你可能感兴趣的:(qt,提高部分,qt,QSystemTrayIcon,c++)