不说废话直接码
先看一下效果图
右键系统托盘的时候会出现这样一个效果(注意 显示出来的这个菜单是在系统托盘的上方,默认的好像是在鼠标的下方,具体我也没有深入研究过,反正我的是)
红色的箭头是鼠标点击的位置
这个是默认的位置
当鼠标悬停的时候会出现提示微信
实现这个非常简单需要 QSystemTrayIcon QMenu QAction类这些都是Qt库里面的
首先我们新建一个窗口设置成无边框的风格的 只需要在主窗口的构造函数里面添加setWindowFlags(Qt::FramelessWindowHint);这句代码 ,窗口就变成无边框的了此时我们也
不能移动窗口,如果需要移动还要自己定义鼠标的按下,移动,释放等事件,这个后续我会在讲。
我们需要自定义一个关闭按钮 点击这个按钮隐藏窗口,而不是退出。
简单写了一下隐藏和还原
效果是这样的
接着我们自定义一个类CustomSystemTray 继承自Qt的类 QSystemTrayIcon
这个类我们实现一下也非常简单
参数有:QWidget *m_parent 主要用于接收父窗口的指针
成员函数有:void initSystemTray(); 用于初始化
在initSystemTray()的构造函数里面添加这两个方法 注意 如果不添加show()方法是不会显示的
setToolTip() 和setIcon()都是继承自Qt 的QSystemTrayIcon类里面的方法直接用就可以
connect()里面用到的信号也是QSystemTrayIcon里面的信号,槽方法onIconActivated()是自己定义的参数也都是QSystemTrayIcon里面的,主要是点击的原因是怎样点击的,有兴趣的话可以自己查一下Qt的帮助文档。
将准备好后缀为.ico的文件添加到Qt的资源文件夹里面,然后将路径设置好。如图
如果系统托盘被点击了 就显示父窗口,并且设置为活动窗口。
在主窗口CCMainWindow构造函数中添加系统托盘
此时就可以运行看效果了但是还没有菜单只有一个系统托盘的图标
这个时候我们可以添加一个自定义的菜单 CustomMenu 继承子QMenu 也很简单添加一个添加菜单的方法addCusotmMenu()有三个参数 分别是 菜单项的名字,图标,菜单显示的名字。
我们用一个QMap映射来接收,传进去菜单项的名字,和一个菜单项 QAction
然后再自定义的CustomSystem类里面添加就可以了自定义一个 方法void addSystemTray();
代码如下; 让显示菜单的位置是鼠标点击的位置,并且进入到事件循环里面去
m_customMenu->exec(pos)
效果如下
此时显示的菜单在鼠标的下方,而其他一些的程序显示的菜单在鼠标的上方如图
这个时候我们就要计算鼠标的位置,和菜单的位置
因为y轴向下是正方向说以要取负
然后move移动菜单的位置
此时就显示在鼠标的上方了