Qt如何实现系统托盘图标?

2017-09-27 22:20:57  阅读 423 次 评论 0 条

    我们常用的一些软件,如QQ、360等都有系统托盘图标。和系统的程序并排在一起,逼格一下就上了一个档次。那么问题来了,咱们大Qt能不能帮我们实现这样的功能呢?

    so easy! Qt表示分分钟就搞定了。看代码:

  //系统托盘
    m_systemTrayIcon = new QSystemTrayIcon(this);
    m_systemTrayIcon->setIcon(QIcon(":/tray.png"));
    m_systemTrayIcon->show();

    用QtCreator创建一个默认的widget程序,然后在widget的构造函数中创建一个QSystemTrayIcon对象,接着设置一个图标,最后show一下。

    blob.png

        

    什么鬼?这样就完了 。没错,托盘图标就这么轻易的被创建出来了。只不过这样的图标没什么意义,只能用来欣赏。还需要稍微完善一下。

    

    1.设置tooltip

  m_systemTrayIcon->setToolTip(QStringLiteral("程序正在运行中!"));

    blob.png  鼠标放在图标上显示提示,可以用于显示程序的状态等。


    2.设置菜单

void Widget::createTrayActions()
{
    m_trayMenu = new QMenu;
    m_trayMenu->addAction(QStringLiteral("设置"));
    QAction* quitAct = m_trayMenu->addAction(QStringLiteral("退出"));
    connect(quitAct,SIGNAL(triggered(bool)),this,SLOT(close()));
}

m_systemTrayIcon->setContextMenu(m_trayMenu); //设置菜单

设置了菜单,右键图标就能弹出菜单了,菜单里想干什么就随意了。


 3.图标除了能右击,还能左键单击、双击等。这里需要用到一个信号activated

connect(m_systemTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(trayAcitved(QSystemTrayIcon::ActivationReason)));

void Widget::trayAcitved(QSystemTrayIcon::ActivationReason reason)
{
    switch (reason) {
    case QSystemTrayIcon::Unknown:
        qDebug()<<"unknown";
        break;
    case QSystemTrayIcon::Context:
        qDebug()<<"context";
        break;
    case QSystemTrayIcon::DoubleClick:
        qDebug()<<"doubleclick";
        break;
    case QSystemTrayIcon::Trigger:
        this->showNormal();
        break;
    case QSystemTrayIcon::MiddleClick:
        qDebug()<<"middleclick";
        break;
    default:
        break;
    }
}

根据激活的原因,做相应的处理。


 4.即使不点击图标也能干活,就是这么傲娇。

 m_systemTrayIcon->showMessage("tip",QStringLiteral("点此退出程序!"),QIcon(":/tray.png"));

使用showMessage会在右下角弹出一条信息。本来想截个图,发现截不了,显示的信息居然在截图界面的上方。不知道这算不算QQ截图的一个bug。


5.最后一点,从上一点看到显示的信息是“点此退出程序”。是的,showMessage展示的信息是可以点击的。只要你连上托盘图标的messageClicked()信号就行了。

 connect(m_systemTrayIcon,SIGNAL(messageClicked()),this,SLOT(slot_messageClicked()));



测试源码下载,测试环境Qt5.9.1



本文地址:http://fearlazy.com/index.php/post/32.html
版权声明:本文为原创文章,版权归 fearlazy 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?