Qt中自定义系统托盘,修改弹出菜单的位置

本文介绍了如何使用Qt库中的QSystemTrayIcon、QMenu和QAction类在Windows托盘区域创建一个可定制的托盘图标,以及如何实现在鼠标点击时显示菜单并调整其位置。作者详细展示了从无边框窗口设置、自定义关闭按钮,到添加自定义菜单和调整菜单显示位置的完整过程。
摘要由CSDN通过智能技术生成

不说废话直接码

先看一下效果图

右键系统托盘的时候会出现这样一个效果(注意 显示出来的这个菜单是在系统托盘的上方,默认的好像是在鼠标的下方,具体我也没有深入研究过,反正我的是

红色的箭头是鼠标点击的位置

这个是默认的位置

当鼠标悬停的时候会出现提示微信

实现这个非常简单需要 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移动菜单的位置

此时就显示在鼠标的上方了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值