Qt - 拖动移动 qgraphicsitem 效果不佳

Qt - drag move qgraphicitem don't work nice

我基于 Qt 标准示例的简单代码 'diagram scene'。 MainWindow 最简单,只加载自定义场景。 UI 是在图形编辑器中制作的。 使用鼠标右键拖动和移动图形多边形工作,左键创建新项目。所以? 我必须双击 select 的项目。当我想要移动项目时,项目需要双击而不释放最后一次单击。满头晕。

商品代码:

BasicDiagramItem::BasicDiagramItem(QGraphicsItem *parent):
    QGraphicsPolygonItem(parent)
{
    drawCustomPoly();
}

void BasicDiagramItem::drawCustomPoly()
{
    QPainterPath path;
    customPoly << QPointF(0,50) << QPointF(50,0)
              << QPointF(0,-50) << QPointF(-50,0)
              << QPointF(0,50);
    setPolygon(customPoly);
    setFlag(QGraphicsItem::ItemIsMovable, true);
    setFlag(QGraphicsItem::ItemIsSelectable, true);
    setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
    //setFlag(QGraphicsItem::ItemClipsToShape,true); //testowe

}

void BasicDiagramItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{

    QGraphicsPolygonItem::mouseMoveEvent(event);
}

场景代码:

DiagramScene::DiagramScene(QObject *parent):
    QGraphicsScene(parent)
{

}

void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    if(mouseEvent->button() != Qt::RightButton) return;

    BasicDiagramItem *item;
    item = new BasicDiagramItem();
    //item->setBrush()
    addItem(item);
    item->setPos(mouseEvent->scenePos());
    QGraphicsScene::mousePressEvent(mouseEvent);

}

void DiagramScene::mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    QGraphicsScene::mouseMoveEvent(mouseEvent);

}

void DiagramScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
    QGraphicsScene::mouseReleaseEvent(mouseEvent);
}

此代码与Qt示例相似。我只是不使用模式创建不同的对象,不使用自定义菜单,我不画箭头。

所以,我做错了什么?为什么应用程序有双击错误?

So, what i do wrong? Why apps have a bug with double-click?

我觉得是这个原因:

void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
   if(mouseEvent->button() != Qt::RightButton) return;

请注意,在 single-left-click 上,mousePressEvent() 只是 returns 没有做任何事情;这可以解释为什么当你 single-left-click 时什么也没有发生。 (在 double-click、OTOH 上,改为调用 mouseDoubleClickEvent(),并且由于您没有覆盖 mouseDoubleClickEvent(),因此调用 QGraphicsScene::mouseDoubleClickEvent() 方法并处理那里的点击。

我想你想做的是:

void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
   if(mouseEvent->button() != Qt::RightButton) 
   {
      QGraphicsScene::mousePressEvent(mouseEvent);  // call up to superclass
      return;
   }

   [...]

这样,QGraphicsScene::mousePressEvent(mouseEvent) 可以完成选择用户单击的项目的工作。