Qt无边框窗体-模拟模态窗体抖动效果
目录
闪动只是一个对外的信息交互,如果大家想要一些其他交互效果,可以自行实现。
二、效果展示
如效果图所示,做了一个简单的效果
- 点击主应用程序时,弹出的模态窗体边框颜色发生了变动,实现了一个抖动的效果。
- 点击桌面时,模态窗体也有一个失去焦点时的状态变化。
三、功能实现
实现窗口抖动效果,首先需要了解windows的消息ID,知道我们要接受哪个windows消息来完成闪动效果,其次就是Qt怎么接收这样的原生windows消息。
windowws消息
了解windows消息ID,随手打开一个搜索引擎,输入关键字
Windows消息ID
,然后就能找到大量的文章专门讲述windwos消息,博主这里找了一篇整理windows消息列表的文章第130条内容,ID为86的WM_NCACTIVATE消息。消息触发的实际是当某个窗口它的非客户区需要被改变来显示是激活还是非激活状态时。 听着有点儿意思,好像是我们需要的,然后就试呗。
Qt接收原生消息
既然锁定了消息ID,那么接下来就是接收这个消息,然后实现响应的UI交互效果即可。
那么问题来了,Qt窗口怎么接收windows原生消息呢!
这个问题当然难不倒我们了。Qt为啥这么火,可不仅仅是因为库封装的好,而是它帮助文档更全。下一步大家应该知道该干什么了吧,打开帮助文档,然后搜索关键字
nativeEv
,如果不知道函数的具体名字或者功能名字,最好进行模糊搜索。不搜不知道,一搜吓一跳,原来还有不少接收原生消息的函数,如下不所示。
上图中总共有如下几个函数
- filterNativeEvent:安装事件过滤器的回调函数
- installNativeEventFilter:安装事件过滤器,回调函数是第4个函数
- nativeEvent:窗口原生事件回调
- nativeEventFilter:事件过滤器回调函数,使用方法2安装
看到这里大家卡能会有些迷茫,好像都差不多呀!其实不然,还是有却别的,感兴趣的同学可以看看我之前写的几篇相关文章,都使用了接收全局windows消息来实现先关功能,具体一点来说就是使用上述的方法2+方法4来完成。
本篇文章我们只是要实现一个模态窗体的抖动而已,因此就不需要大材小用了,我们使用QWidget的nativeEvent函数即可,同样能达到我们的目的。
大方向都定了,那么还等什么
打开vs,新建了一个demo。哐哐哐,就是一顿干。。。。
发现还真好使,窃喜中。。。
下面是实现的核心代码,由于是demo,所以写的比较粗糙,大家在写到项目里时最好能规范下代码。
bool XXX::nativeEvent(const QByteArray &eventType, void *message, long *result) { if ("windows_generic_MSG" == eventType) { MSG * pMsg = reinterpret_cast<MSG *>(message); if (pMsg->message == WM_NCACTIVATE) { bool active = (bool)(pMsg->wParam); if (active) { setStyleSheet("border:2 solid blue;background:gray;"); } else { setStyleSheet("border:2 solid red;background:gray;"); } style()->unpolish(this); style()->polish(this); } } return QDialog::nativeEvent(eventType, message, result); }
重点强调
这里还需要说一点,有些同学按照文档操作了,调试时代码也走到相关位置了,但是发现没有效果,然后就开始怀疑人生了。
这里博主重点说几个可能出现错误的地方
- 我们的模态窗体一定要指定模态的父窗体是谁
- 窗体一定要设置上Qt::Dialog属性
第二点是非常关键的,很多同学都是没有设置这个属性,导致失去了效果。
四、相关文章
- Qt自定义的无边框Dialog 在点击其他窗口时处理闪烁效果
- Qt无边框窗体-最大化时支持拖拽还原
- Qt之自定义QLineEdit右键菜单
- qt捕获全局windows消息
- Qt之股票组件-股票检索--支持搜索结果预览、鼠标、键盘操作
值得一看的优秀文章:
如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!