范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Qt之自定义托盘(一)

  说起Qt,真是个不错的ui库,不仅仅ui做的好,其他方面也不差,在平台扩展方面也是非常的强大。这篇文章我将会分析下qt的托盘,QSystemTrayIcon是qt的托盘类,托盘类的用途是什么我就不说了,自行百科就好,关键问题是我们要实现自定义的托盘。
  说起常用的客户端软件,qq,微信等聊天工具,有这么几个托盘事件:
  1、来消息图标闪烁
  2、气泡消息提示
  3、鼠标左键单击、左键双击、右键单击、滚动单击
  上述这三种事件QSystemTrayIcon类都完全能够解决,但是托盘的hover事件却无能为力,如图1所示,途图中是帮助文档中的一段描述,指明了只有在x11系统中,可以捕获到系统的tooltip事件,其他系统都无能为力,我自己也看了下qt的源码,果真是这样的,有兴趣的同学可以自行在研究下。
  图1 帮助文档
  如图2所示,qq有消息时,鼠标hover在图盘弹出菜单,那么qq是怎么做的呢,既然qq都到做到了,这个功能我们自己想必肯定也能实现。
  图2 托盘hover弹框
  好了,上边说了这么多,仅仅是为了铺垫我自己实现的托盘,完全脱离了qt中的托盘类QSystemTrayIcon,不过也不能说完全脱离,部分代码还是从qt源码中摘出来的。文章的最后我附上我自己用qt实现的自定义托盘和下载别人用mfc自定义实现的自定义托盘。
  因为win32我自己也不是特别了解,因此我也是大概说下自定义托盘需要了解的东西,首先是NOTIFYICONDATA结构,这个结构百科讲的特别详细,看一下就知道怎么用,然后是Shell_NotifyIcon这个api,这个方法就是对托盘操作的接口。具体参数百科中说的很详细,不过如果你不想看也无所谓,直接往下看也可以。对盘托的操作在windows平台下都是一样的,关键问题是用qt怎么接受这个图盘的hover和leave消息。
  关于这个托盘的实现我也是从mfc的示例代码中获取的启发,然后用qt方法实现,接下来我就直接说下用qt实现的步骤:
  1、首先我们需要了解下QAbstractNativeEventFilter这个接口类,继承这个接口类的类可以把自己注册到app中,然后就能获取到整个app
  的事件,事件的处理函数为nativeEventFilter,该类有3个参数,具体可以参见这篇文字qt捕获全局windows消息 这个文章中说的不全是对的,不过能抓取到app消息应该是没问你的,本篇博客的demo也是印证了这个问题。注册代码如下:
  1   qApp->installNativeEventFilter( this  );
  2、第二步就是创建托盘图标,创建托盘图标的时候,windows提供了api,代码如下:  1 NOTIFYICONDATA    nid;  2     QLabel *l = new QLabel;  3     nid.cbSize = sizeof nid;  4     nid.hIcon = qt_pixmapToWinHICON(QIcon(":/trayIcon/Resources/childrenWidget.ico").pixmap(16, 16));  5     nid.hWnd = HWND(l->winId());  6     nid.uCallbackMessage = WM_TRAYNOTIFY;  7     nid.uID = 1;  8     nid.uFlags = NIF_ICON | NIF_MESSAGE;  9  10     Shell_NotifyIcon(NIM_ADD, &nid);
  此处代码中有一个标签l,创建他是因为创建图标时需要一个接受鼠标事件的窗口句柄hWnd,如果没有句柄,那么托盘也不能创建成功;其他成员的含义从变量的命名上应该也能理解,我重点说下uFlags这个变量,他其实本身没有什么含义,主要是为了标示NOTIFYICONDATA结构中其他成员那个是有效的,这个也方便了我们后续对托盘图标的修改。比如说修改tooltip、修改图标等信息。uCallbackMessage是消息id,在我们后续处理的逻辑中会用到
  3、鼠标事件处理  1 bool trayIcon::nativeEventFilter(const QByteArray & eventType, void * message, long * result)  2 {  3     if (eventType == "windows_generic_MSG" || eventType == "windows_dispatcher_MSG")  4     {  5         MSG * pMsg = reinterpret_cast(message);  6         if (pMsg->message == WM_TRAYNOTIFY)  7         {  8             switch (pMsg->lParam)  9             { 10             case WM_MOUSEMOVE: 11                 m_traypos.OnMouseMove(); 12                 break; 13             case WM_MOUSEHOVER: 14                 m_Menu->show(); 15                 break; 16             case WM_MOUSELEAVE: 17                 m_Menu->hide(); 18                 break; 19             case WM_LBUTTONDBLCLK: 20             //    m_Menu->show(); 21                 break; 22             case WM_LBUTTONDOWN: 23             //    m_Menu->show(); 24                 break; 25             case WM_RBUTTONDOWN: 26             //    m_Menu->show(); 27                 break; 28             } 29         } 30     } 31  32     return false; 33 }
  上述代码主要是针对鼠标事件的一个处理。WM_TRAYNOTIFY消息是我们开始的时候注册到图盘中的消息,当托盘发生鼠标事件的时候我们只需要关注自己注册的消息,对于windows托盘稍微有了解的同学可能也知道,微软没有提供给我们托盘图标的进入和离开事件,而仅仅提供了鼠标move的事件,不过仅仅有这一个事件我们就可以模拟出其他的事件来。细心的同学将会注意到 m_traypos.OnMouseMove();这句代码,其实m_tryapos这个对象是一个move事件处理类,他可以模拟出鼠标hover和leave事件来。关于这个类的解释我就不说了,是一个国外的大牛写的,demo中有源文件。
  点击领取Qt学习资料+视频教程~「链接」
  4、程序退出时销毁托盘图标
  Shell_NotifyIcon(NIM_DELETE, &m_NotifyIconData);
  通过上述的代码整理,简单的托盘就可以实现了,因为我是自己做的demo,因此不是所有事件的处理了的,高级定制的功能如果有兴趣的同学可以给我留言,或者私信我可以,如果是我实现了的,我将愿意和大家一起分享。我下边链接中的这个demo其实比较粗糙,就仅仅的可以实现鼠标在托盘图标上的hover和leave请求。
  最后我上两张效果图,图3是mfc示例的鼠标hover截图,图4是qt示例的鼠标hover截图
  图3 mfc示例demo
  图4 qt示例demo
  注意:这个demo非常粗糙,不过我已经讲明了怎么实现一个自己的托盘,关于需要怎么实现一个完美的托盘,同学们可以参考qt的源码中qsystemtrayicon_win.cpp文件,该文件就是QSystemTrayIcon类的真正实现。
  qt示例链接:http://download.csdn.net/detail/qq_30392343/9608076
  mfc示例链接:http://download.csdn.net/detail/qq_30392343/9608078

福州近郊游有哪些地方?福州,简称榕,别称榕城,是福建省省会,滨江滨海生态园林城市,国家历史文化名城。近郊游玩的地方有三坊七巷,上下杭,福州文庙,李士甲别墅,鼓岭教堂,福州英国领事分馆旧址,泛船浦教堂,乌6G手机跟5G比有什么优势?最明显的区别是速度。与5G相比,6G将使用更先进的无线电设备和更大数量的无线电波,缩短延时!目前而言,5G已经广泛应用,以后的社会,效率会成为主角,而网络平台将会是主角的正式舞台!苹果攻势颇猛,国内手机行业受制于人,该如何奋起直追?这个单纯的靠企业的力量是不太可能的,也不要想着去追赶什么苹果其实这种事情,是没有什么意义的事情。就百度一样,这么大的力度还是摆脱不了谷歌的阴霾,为什么呢?从有计算机开始我们的整体的南京有什么双非的一本院校值得报考吗?根据题主南京有什么双非的一本院校值得报考的吗?我可以告诉你,教育部早已取消211985工程重点建设的大学的称号,今后只提双一流大学和学科,也就是建设一流大学和一流学科。目前江苏省不牙齿怕冷怕热,还有点松动,该怎么办?像您所说的情况,考虑是牙齿敏感导致的。冷热酸甜硬物都会让牙齿受到刺激,然后导致牙敏感。长期也敏感会使牙龈萎缩产生牙齿不牢固的情况。应该咱们办呢?首先就是远离可能会造成牙敏感的东西,怎么看待,每天只做二三十个俯卧撑,30个仰卧起坐就想要胸肌腹肌的人?只能说梦想很纯真,现实很残酷!想要强大的肌肉,必须要让训练强度适合自身,这是一个循序渐进的过程!每天完成xx个俯卧撑xx个仰卧起坐,就能练出胸肌和腹肌吗?俯卧撑是锻炼胸肌的基础训练炒股就是赌博,你同意吗?不同意,你这是在侮辱赌博。人家正规赌博的不能提前知道答案不能看对方底牌不能随意改变规则也不会因为你赢了,就给扣上恶意赢钱的帽子,抓起来!总之,赌博要更加公平公正公开一些。不是赌博该怎样的人在公司才能晋升的快?什么样的人在公司才能快速晋升,我认为有以下几点1做事靠谱。这个概念有点抽象,简单点说就是做事有闭环思维,领导交给你的工作有始有终,中间有过程。让领导觉得这事交给你做放心,哪怕你能力全职妈妈没收入,老公给你一个月多少生活费?其实我一直搞不懂一件事情,就是如果女的全职在家带孩子,没有收入,没有积蓄,手里一分钱没有,男的不主动给钱的话,是想所有的日常开销他都亲自支付吗?我是一直想这样的,凡事不操心,缺啥喊春节联欢晚会,你喜欢看直播还是复播?春节联欢晚会都是爱看直播吧,一家人围坐在一起吃着年夜饭,看春节晚会迎接新年到来钟声敲响,举国欢庆万家团圆共同祝愿华夏繁荣富强!看春晚复播跟直播心情完全是不一样的。直播好一点。看复播中年男人无妻是什么感受?离婚四年了,四十多快五十了,开始的时候,确实挺想找一个女人,想着下半辈子连个身边说话的人都没有,该怎么过呢?但几番和女人了解过来,觉得再婚反而很不现实了,一般也就是找比自己小几岁的