Qt实现任务栏中的托盘图标的功能.

看我们电脑最下面一行的任务栏,会发现有一些软件被关闭后,还会继续存在任务栏中,当点击任务栏中的图标时,又会跳出来这个软件的画面,主要用到了Qt中的QSystemTrayIcon这个类,下面我们来简单的展示下实现的方法:

//"c.cpp"的代码:
#include "c.h"
c::c(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    //创建一个菜单,只包含一个quit菜单项.
    m_menu = new QMenu;
    m_quitAction = new QAction("quit", this);
    m_menu->addAction(m_quitAction);
    //创建一个QSyStemTrayIcon的对象.
    m_trayIcon = new QSystemTrayIcon();
    //设置图标.
    m_trayIcon->setIcon(QIcon("tray.ico"));
    //设置右键菜单.
    m_trayIcon->setContextMenu(m_menu);
    m_trayIcon->show();
    //设置提示.
    m_trayIcon->setToolTip("click me~!");
    //设置显示一个messageBox3秒.
    m_trayIcon->showMessage(QString::fromLocal8Bit("成功"), QString::fromLocal8Bit("您已成功连接到网络!"),QSystemTrayIcon::Information,3);

    //这个是对于托盘图标的触摸事件,当被单击,双击等时发出信号.
    connect(m_trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayIconTouchSlot(QSystemTrayIcon::ActivationReason)));
    //当点击图标上面的messageBox时发出信号.这里只是用来演示这个信号.
    connect(m_trayIcon, SIGNAL(messageClicked()), this, SLOT(messageClickedSlot()));
    //对图标右键产生的菜单的quit菜单项做出操作.
    connect(m_quitAction, SIGNAL(triggered()),this, SLOT(quitActionSlot()));
}
c::~c()
{

}
void c::trayIconTouchSlot(QSystemTrayIcon::ActivationReason type)
{
    //判断用户对图标触摸的类型.是双击,还是点击,还是右击等等.
    switch (type)
    {
    case QSystemTrayIcon::Trigger:
    case QSystemTrayIcon::DoubleClick:
        //正常模式显示.
        this->showNormal();
        //当前窗口显示为顶级窗口,如果没有这条语句的话,窗口就可能会出现在底层,被别的页面层覆盖而看不到了.
        this->activateWindow();
        break;
    default:
        break;
    }
}
void c::messageClickedSlot()
{
    QMessageBox::information(this, "clicked", "clicked!");
}
void c::closeEvent(QCloseEvent *event)
{
    //当我们点击右上角的X时,有些软件只是想把软件最小化,还是可以通过任务栏的图标来显示窗口的.
    this->setVisible(false);
    //对关闭事件做出一个反应.
    event->ignore();
}
void c::quitActionSlot()
{
    //关闭程序.
    QApplication::exit(-1);
}

下面是”c.h”头文件的代码:

#ifndef C_H
#define C_H

#include 
#include "ui_c.h"
#include 
#include 
#include 
#include 
#include 
#include 

class c : public QMainWindow
{
    Q_OBJECT

public:
    c(QWidget *parent = 0);
    ~c();
private slots:
    void trayIconTouchSlot(QSystemTrayIcon::ActivationReason type);
    void messageClickedSlot();
    void quitActionSlot();
protected:
    void closeEvent(QCloseEvent *event);
private:
    Ui::cClass ui;
    QSystemTrayIcon *m_trayIcon;
    QMenu *m_menu;
    QAction *m_quitAction;
};

#endif // C_H

你可能感兴趣的:(Qt)