如果你的QGraphicsWidget、QGraphicsItem无法相应鼠标、键盘消息,请参考《QGraphicsWidget收不到鼠标、键盘消息解决》
两种方法
方法1:
先通过下面的代码设置被拖动想的属性:
setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemSendsGeometryChanges | QGraphicsItem::ItemUsesExtendedStyleOption);
如果你的视图是继承自QGraphicsView,则在重载鼠标移动事件时,基类QGraphicsView的鼠标移动事件请不要屏蔽,否则不能移动项,如下:
void GraphicsView::mouseMoveEvent(QMouseEvent *event)
{
// 这里根据业务写你需要的代码
QGraphicsView::mouseMoveEvent(event); // 这句不能漏掉,否则项不能移动
}
即上面的QGraphicsView::mouseMoveEvent(event); 这句不能漏掉,否则项不能移动。
方法2:
重写鼠标事件
继承QGraphicsItem,重写mousePressEvent、mouseMoveEvent和mouseReleaseEvent三个函数。
void BreakerItem::mousePressEvent( QGraphicsSceneMouseEvent* event )
{
m_mousePressed=true;
m_mousePressedPoint=this->scenePos()-event->scenePos();
}
void BreakerItem::mouseMoveEvent( QGraphicsSceneMouseEvent* event )
{
if(m_mousePressed==true)
{
this->setPos(event->scenePos()+m_mousePressedPoint);
}
} void BreakerItem::mouseReleaseEvent( QGraphicsSceneMouseEvent* event )
{
m_mousePressed=false;
}
方法2没有亲自测试过,从网上找的。