首页 > 代码库 > Qt实现系统托盘

Qt实现系统托盘

        平时大多数看到的软件都是带系统托盘的,这样软件可以在后台运行,挺好的。今天看了下Qt自带的demon,中间有参考了下,实现了这个小小的功能,就将这个功能添加到了自己之前的一个项目中,效果蛮好的。界面如下所示:


右击系统托盘就会显示当前设定的各个菜单功能:

怎么样,效果还好吧。实现这个小功能厅满意的。右键点击弹出的菜单可以自行设定所需的。另外可以设定鼠标单击、双击、中间键分别按下时所触发的动作。主要代码如下所示:

1、首先需要添加头文件,Qsystem/trayIcon类、QMenu类和QAction三个类

<span style="font-size:18px;"><strong>    QSystemTrayIcon *myTrayIcon;                                  //系统托盘指针
    QMenu *myMenu;                                                //系统托盘菜单
    QAction *miniSizeAction;                                      //最小化
    QAction *maxSizeAction;                                       //最大化
    QAction *restoreWinAction;                                    //还原
    QAction *quitAction;                                          //退出
    QAction *checkUpdate;                                         //检查更新</strong></span>

功能功能实现:

<span style="font-size:18px;"><strong>/*
 *函数功能:创建系统托盘菜单
 *输入参数:无
 *输出参数:无
 *说明:此函数用于创建系统托盘的菜单,提供用户点击相应的菜单进行操作
*/
void MainWindow::CreateTrayMenu()
{
    miniSizeAction = new QAction(tr("最小化(&N)"),this);
    miniSizeAction->setToolTip(tr("最小化"));
    miniSizeAction->setIcon(QIcon(":/images/systemtrayico/minac.png"));

    maxSizeAction = new QAction(tr("最大化(&X)"),this);
    maxSizeAction->setToolTip(tr("最大化"));
    maxSizeAction->setIcon(QIcon(":/images/systemtrayico/maxac.png"));

    restoreWinAction = new QAction(tr("还原(&R)"),this);
    restoreWinAction->setToolTip(tr("还原"));
    restoreWinAction->setIcon(QIcon(":/images/systemtrayico/restoreac.png"));

    quitAction = new QAction(tr("退出(&Q)"),this);
    quitAction->setToolTip(tr("退出"));
    quitAction->setIcon(QIcon(":/images/systemtrayico/exitac.png"));

    checkUpdate = new QAction(tr("检查更新(&C)"),this);
    checkUpdate->setToolTip(tr("检查更新"));
    checkUpdate->setIcon(QIcon(":/images/systemtrayico/updateac.png"));

    //将各个菜单进行槽连接,触发相应的动作
    connect(miniSizeAction,SIGNAL(triggered()),this,SLOT(hide()));
    connect(maxSizeAction,SIGNAL(triggered()),this,SLOT(showMaximized()));
    connect(restoreWinAction,SIGNAL(triggered()),this,SLOT(showNormal()));
    connect(quitAction,SIGNAL(triggered()),this,SLOT(logoutWidget()));
    connect(checkUpdate,SIGNAL(triggered()),this,SLOT(checkSysUpdate()));

    //将创建的菜单对象添加到系统托盘的菜单中
    myMenu = new QMenu((QWidget*)QApplication::desktop());
    myMenu->addAction(miniSizeAction);
    myMenu->addAction(maxSizeAction);
    myMenu->addAction(restoreWinAction);
    myMenu->addSeparator();
    myMenu->addAction(checkUpdate);
    myMenu->addSeparator();                 //加入一个分隔符
    myMenu->addAction(quitAction);
}

/*
 *函数功能:创建软件最小化时的系统图标以及一些信息的显示
 *说明:对系统是否支持系统图盘图标特效作出判断,支持就执行相应的动作
*/
void MainWindow::CreateTrayIcon()
{
    CreateTrayMenu();

    //判断系统是否支持系统托盘图标
    if(!QSystemTrayIcon::isSystemTrayAvailable())
    {
        return;

    }

    myTrayIcon = new QSystemTrayIcon(this);
    myTrayIcon->setIcon(QIcon(":/images/main.png"));
    myTrayIcon->setToolTip(tr("大众超市收银系统 V2.0"));

    myTrayIcon->showMessage("大众软件","软件进入了最小化模式,若想恢复,点击还原",QSystemTrayIcon::Information,10000);
    myTrayIcon->setContextMenu(myMenu);
    myTrayIcon->show();

    connect(myTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(iconAcitvated(QSystemTrayIcon::ActivationReason)));
}</strong></span>

鼠标点击事件处理:

<span style="font-size:18px;"><strong>/*
 *函数功能:执行鼠标点击系统托盘菜单后相应的动作
 *说明:当鼠标点击菜单时所触发的动作
 *     (左、右)单击、双击、中间按钮。可以对这几个动作分别处理相应的事件
*/
void MainWindow::iconAcitvated(QSystemTrayIcon::ActivationReason reason)
{
    switch(reason)
    {
    case QSystemTrayIcon::Trigger:
        this->showNormal();
        break;
    case QSystemTrayIcon::DoubleClick:
        this->showMaximized();
        break;
    case QSystemTrayIcon::MiddleClick:
        //
        break;
    default:
        break;
    }
}</strong></span>

基本代码就这些。

需要代码的可以留下邮箱,发给你们……

技术在于交流……



Qt实现系统托盘