今天在测试别人遗留的bug的时候,发现一个细节,很容易忽略的问题,记录下
在对基于QGraphicsItem的类进行封装的时候,出现一个问题,就是拖动或者涉及到mouseMoveEvent()函数的时候,会出现位置不准确,达不到理论的移动效果,(逻辑是正确的)
是由于在重写的函数中添加了QGraphicsItem::mouseMoveEvent(event);这是我们的习惯导致的,
Qt的QGraphicsItem::mouseMoveEvent(event)本身会对item的pos进行设置,所以会出现move的时候,位置不准确,将QGraphicsItem::mouseMoveEvent(event);注释掉即可
//在执行QGraphicsItem的时候。会自动的进行pos的重新设置
// QGraphicsItem::mouseMoveEvent(event);
QPointF disPointF = event->scenePos() - m_lastPointF;
m_lastPointF = event->scenePos();
if(/*满足条件1,鼠标拖动item的某一点*/){
qDebug()<<this->pos()<<this->boundingRect()<<m_vecPointFs[m_iIndex];
m_vecPointFs[m_iIndex] = event->scenePos();
updateMiniRect();
}else if(/*满足条件2,拖动整个item*/){
//拖动的时候。m_vecPointFs是不变化的,变化的是this->pos()
for(int i=0;i<m_vecPointFs.count();i++){
m_vecPointFs[i] = m_vecPointFs[i]+disPointF;
updateMiniRect();
this->scene()->update();
QGraphicsItem events
QGraphcisItem通过QGraphicsScene的sceneEvent()这个虚函数来获取事件。这个虚函数把最常见的事件分配给事件处理程序:
1.contextMenuEvent()处理上下文菜单事件;
2.focusInEvent()和focusOutEvent()处理是否聚焦的事件;
3....
graphics体系中graphicsitem重载鼠标事件,item只触发press事件,没有触发move和release事件,scene和view都能触发press、move、release事件。
经过看帮助文档,查看graphicsitem mousemoveevent的说明
翻译后是:
可以重新实现用于事件事件的该事件处理程序,以接收该项目的鼠标移动事件。 如果确实收到此事件,则可以确定该项目也收到了鼠标按下事件,并且该项目是当前的鼠标捕获器。
在事件上调用QEvent :: ignore
QGraphicsItem的mouseMoveEvent()函数必须鼠标按下的情况下进行move才会触发。QWidget的mouseMoveEvent()函数可以通过设置setMouseTracking(true)在鼠标不需要按下的情况下,触发鼠标move事件。
QGraphicsItem要实现鼠标不按下的情况下,获取鼠标move事件,可通过**hoverMoveEvent()来实现,可通过设置setAcceptHoverEv
1、setAcceptDrops(true);
这个设置后,并不是能拖动,而是可以接受dropEvent事件,也就是能响应到拖拽时的放下事件,不设置该属性,则视为该Item不能Drop。 拖拽由下面的 mouseMoveEvent 中的QDrag实现
2、mouseMoveEvent
void GQIGraphicsItem::mouseMoveEvent(QGraphicsSc...
文章目录1. 平移2. 改变尺寸3. 旋转
我们在使用QGraphicsView框架的时候,经常需要自定义QGraphicsItem,并且需要实现Item的平移、改变大小和旋转的效果。接下来介绍他们的一种实现方式
1. 平移
平移效果如下图所示:
实现方式有两种方法:
使用QGraphicsItem本身的移动标志实现。
this->setFlag(QGraphicsItem::Ite...
一、 解决思路
1) 确定旋转中心坐标:centerPos;
2) 在mousePressEvent(QMouseEvent *e)中e->pos()获得按下时的坐标:pressPos
3) mouseMoveEvent(QMouseEvent *e)中e->pos()获得当前坐标:movePos;
4) center...