上一篇文章通过继承QGraphicsItem类来定制自己的图元类,这样就可以根据自己的需求来制作它的形状、颜色、属性以及交互等。但是这样的图元会存在一个缺点,那就是不能使用Qt的信号/槽机制,也不能使用Qt属性系统,因为QGraphicsItem并不继承于QObject。缺少信号/槽这样好用的机制会使得自定义图元与其他对象交互变得很不方便,不能使用属性系统也会让类失去更多的扩展性。总之不从QObject派生类会给类的使用带来很多的不利。

     好在Qt已经考虑到了这些问题,QGraphicsObject应运而生。QGraphicsObject同时继承于QObject和QGraphicsItem。这样自定义图元既可以获得QGraphicsItem中写好的图元特性又能使用信号/槽机制方便信息传递。

    举例:

    在上一篇的例子上进行修改,实现这样的效果:在场景中添加几个自定义图元,当鼠标移动到一个图元之上,所有图元的文字都变为“yes”。

  与上一篇例子相比多了一个通知过程,即鼠标移动到一个图元之上时让其他图元设置文本的内容。

    1. 创建一个CustomObject类,父类为QObject。 注意别忘记写Q_OBJECT宏。给类添加一个sigMouseHover信号,表示鼠标在图元上方。

    2. 重写boundingRect和paint函数,定制图元的外观。

blob.png

    3. 重写图元的鼠标悬浮进入事件,该函数的作用就是发送信号,其他操作按父类进行。需要注意的是图元类默认不接收hover的相关事件,需要调用setAcceptHoverEvents(true)。

blob.png

    4.创建自定义图元并添加到场景中。

blob.png    在此创建了4个自定义图元,图元的文字分别为hello、fearlazy、come、co。创建图元后连接信号到Widget的sltMouseOnItem槽中,并将对象添加到m_objList容器中。

    sltMouseOnItem的作用就是遍历m_objList这个容器,将所有的自定义图元为全部设置为"yes"。代码如下:

blob.png

    5.运行效果:

鼠标移动到图元上

blob.png

鼠标移动到任一图元上

blob.png



作者:fearlazy 一个入行5年的程序员新人。 文章内容仅代表个人观点,如有雷同请为我点个赞吧!