QT中自定义系统托盘的实现—c++语言为例

将要介绍的是:QT中自定义系统托盘(systemtray)的一个Demo,希望能帮需要的读者快速上手。

前提假设是诸位已经知道QT中的signals 、slot以及资源文件,所以关于这些不会再累述。

我的QT版本如下:

整体的工程目录如下所示:

创建过程如下:

首先新建一个MainWindow工程,工程名为systemTray,会包含5个文件systemTray.pro、main.cpp、mainwindow.h、mainwindow.cpp和aminwindow.ui

这时运行程序会生成一个空白窗口如下:

然后添加资源文件,用于设为系统托盘图标,这里我上穿的是main.ico,也可以上传png图片等,具体请学习如何添加资源文件。

然后新建一个C++类systemTray,继承QSystemTrayIcon,产生两个文件systemTray.h和systemTray.cpp

自定义的系统托盘的实现就在上面这两个文件里。

systemTray.h如下:

#ifndef SYSTEMTRAY_H
#define SYSTEMTRAY_H

#include <QSystemTrayIcon>
#include <QAction>
#include <QApplication>
#include <QMenu>


class SystemTray : public QSystemTrayIcon
{
    Q_OBJECT
public:
    explicit SystemTray(QWidget *parent = 0);
    ~SystemTray();
    void addAction();
    void createAction();
private:
    QMenu *myMenu;//托盘菜单
    QAction *restoreWinAction;//还原
    QAction *quitAction;//退出
    QAction *aboutUsAction;//关于我们
    QAction *updateAction;//更新

private slots:

signals:
    void showWidget();
private slots:
    void showAboutUs();
};

#endif // SYSTEMTRAY_H

系统托盘菜单有四个选项:还原、退出、关于我们和更新。上面的signals:showwidget() 是点击还原时发送的信号,信号交给mainwindow处理。showAboutUs是点击关于时触发的事件。

systemTray.cpp如下:

#include "systemtray.h"

SystemTray::SystemTray(QWidget *parent)
    : QSystemTrayIcon(parent)
{
    createAction();
    addAction();
}

SystemTray::~SystemTray()
{

}
void SystemTray::createAction()
{
    restoreWinAction = new QAction("还原",this);
    aboutUsAction =    new QAction("关于",this);
    updateAction =     new QAction("更新",this);
    quitAction =       new QAction("退出",this);

    myMenu = new QMenu();

    this->setIcon(QIcon(":/Icon/systemIcon/main.ico"));
    this->setToolTip("系统托盘演示程序");

    connect(restoreWinAction, SIGNAL(triggered()), this, SIGNAL(showWidget()));
    connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
    connect(aboutUsAction,SIGNAL(triggered()),this,SLOT(showAboutUs()));
    this->setContextMenu(myMenu);     //设置托盘上下文菜单
    this->show();
}

void SystemTray::addAction(){
    myMenu->addAction(restoreWinAction);
    myMenu->addAction(aboutUsAction);
    myMenu->addAction(updateAction);
    myMenu->addAction(quitAction);
}

void SystemTray::showAboutUs(){
    //显示关于我们的窗口,没有具体实现
    //当然也可以不用SOLT函数,而是像“还原“操作一样,发送信号出去,留给主窗口来处理
}

mainwindow.h如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "systemtray.h"
#include "QSystemTrayIcon"
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    SystemTray * myTray; //自定义系统托盘
private slots:
    void ShowWindow(); //处理还原操作
    void SystemTrayActivated(QSystemTrayIcon::ActivationReason reason);//处理点击托盘操作
};

#endif // MAINWINDOW_H

mainwindow.cpp如下:

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    myTray = new SystemTray(this);

    connect(myTray,SIGNAL(showWidget()),this,SLOT(ShowWindow()));//关联信号和槽函数
    connect(myTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(SystemTrayActivated(QSystemTrayIcon::ActivationReason)));
}

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

void MainWindow::ShowWindow(){
    this->showNormal();
    this->raise();
    this->activateWindow();
}


void MainWindow::SystemTrayActivated(QSystemTrayIcon::ActivationReason reason) {
    switch(reason)
    {
    case QSystemTrayIcon::Trigger:
    {
        ShowWindow();
        break;
    }

    case QSystemTrayIcon::DoubleClick:
    {
        ShowWindow();
        break;
    }
    default:
        break;
    }
}

 

posted on 2015-05-16 21:03  shenghl  阅读(2001)  评论(0编辑  收藏  举报

导航