Qt如何实现系统托盘图标?
我们常用的一些软件,如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一下。
什么鬼?这样就完了 。没错,托盘图标就这么轻易的被创建出来了。只不过这样的图标没什么意义,只能用来欣赏。还需要稍微完善一下。
1.设置tooltip
m_systemTrayIcon->setToolTip(QStringLiteral("程序正在运行中!"));
鼠标放在图标上显示提示,可以用于显示程序的状态等。
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