QWidget based hover效果


很早之前就觉得现代的软件界面真的是越来越华丽了,各种动画满天飞啊。
QT来说也是如此。近几年大力发展的QT Quick,qml技术就是一个很好的体现。但是学习这些东西所花费的事件总比我们能够支配的时间更长(QML基于JS语法)。
虽然利用qml能够较简洁的实现很好的动画效果。但是我们有时候能在现有技术的基础上稍加修改就能实现一定的动画,让我们的程序外观有质的飞跃的话。最简单的方式,就是跟踪鼠标,判断鼠标在什么控件上,然后做出相应的处理。

笔者的目的就是在以QWidget为基类的控件类上面事件简单的hover效果:
当鼠标移动到一个控件的时候就以其自身的中点为中心放大一定的倍数,鼠标移走之后就变回原来的大小。很简单吧?
开始这样想的。确确实实QT也提供了一些不错的方法。但是。。。在看了QWidget的基类的一些方法之后,发现还真没有QGraphicsView里面的直接的HoverEvent好用。还不好判断什么时候一个Widget获取了鼠标信息。也就是说这个什么时候鼠标在这个Widget里面。什么时候移出这个Widget。
那么怎么才能很方便的实现这种需求呢?
虽然QWidget基类也提供了一个EnterEvent与一个LeaveEvent两个事件来帮助我们实现自己的代码,甚至还有万能的Event的事件,整个系统的截获hook来让我们获取所有所需要的事件。但是。如果要使用这种方式的话。在每一个派生自QWidget的子类的基础上的控件都要子类话,然后仅仅的重载两个事件。虽然也不是不可以。但是在实现上存在很大的困难:

  1. 对于一般的小程序,我们都喜欢在qt设计师里面直接拖动控件摆放到自己喜欢的位置。这样就会导致系统直接使用了本身的类,无法重载。
  2. 对于一个已经存在的一个项目。前人已经设计好了很多的代码。要把里面的控件全部提取出来进行子类化,这个工作量绝对不是短时间内可能完成的。而且还会带来由于代码量增加导致的bug数可能增加的隐性问题。

    今天在群里面讨论了之后,有人介绍了一个非常简单的实现方式。研究了一下具体的实现,确实比较简单。现在总结一下整个实现流程
    (待续)
comments powered by Disqus