zoukankan      html  css  js  c++  java
  • Qt 重写QGraphicItems的类,拖动缩放对象的时候偶尔接收不到鼠标点击事件

    我写了一个类,继承自QGraphicItems
    然后重写了 paint(), boundingRect() 和shape() 方法
    paint()绘制的图形如下图所示:
    在这里插入图片描述
    shape()中返回的是上面红线标出的区域
    boundingRect() 中返回的是上面红线区域的最小外接矩形

    然后我重写了mousePressEvent(),mouseMoveEvent(),mouseReleaseEvent()以实现鼠标按住上面任意一个顶点可进行图形的拉伸,如下图所示:
    在这里插入图片描述
    在这个过程中,会出现一个问题,就是鼠标拖动顶点移动几次之后,图像会接收不到鼠标点击事件,也就是再也无法拉伸上面这个图像了。
    研究了半天发现,问题出在qt的QGraphicsScene场景上面:
    我们在缩放QGraphicsScene内部的QGraphicItems的时候,QGraphicsScene会自动判定是否需要重新获取QGraphicItems的边框(也就是调用QGraphicItems内的boundingRect() 和shape()),换句话说,QGraphicItems内的boundingRect() 和shape()函数是否被调用,全看QGraphicsScene的心情。
    而我们在缩放图形的时候,往往会把图形拉伸到超过原先的边框区域,这个时候如果QGraphicsScene不调用boundingRect() 和shape()函数的话,就会出错。
    出错形式表现为:我们拉伸完item的时候,再把鼠标移上去,却触发不了item的鼠标事件
    解决方法:
    在拉伸的时候,也就是在mouseMoveEvent()函数内,先执行

    prepareGeometryChange()

    方法,通知QGraphicsScene:老子要重绘item了,你给我准备好重新获取item的边框!
    然后再写根据鼠标位置重置item大小的代码,然后执行

    scene()->update();//刷星界面
  • 相关阅读:
    学而时习之,不亦乐乎。
    uva10025 The ? 1 ? 2 ? ... ? n = k problem
    uva591 Box of Bricks
    uva253 Cube painting
    uva10194 Football (aka Soccer)
    用WORD2007发布博客文章
    Microsoft Silverlight 1.0 SDK 中文版推出
    vista sp1/office 2007 sp1和xp sp3都出来了
    scrollLeft,scrollWidth,clientWidth,offsetWidth,screen.width全解析(转帖)
    在C#中使用My命名空间
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13862382.html
Copyright © 2011-2022 走看看