Qt - 拖动移动qgraphicitem不好用

时间:2017-01-29 00:10:40

标签: c++ qt scene graphic

我的简单代码基于Qt标准示例'图表场景'。 MainWindow最简单,只加载自定义场景。用户界面是图形编辑器。 使用鼠标右键拖动和移动图形多边形,左侧创建新项目。所以? 我必须双击项目才能选择它。当我想要移动项目时,项目需要双击而没有释放最后一次点击。完全晕了。

商品代码:

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示例相似。我只是不使用模式创建不同的对象,不要使用cutom菜单,我不画箭头。

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

1 个答案:

答案 0 :(得分:1)

  

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

我认为这就是原因:

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

请注意,在单击左键单击时,mousePressEvent()只返回而不执行任何操作;这可以解释为什么单击左键时没有任何反应。 (在双击时,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)可以完成选择用户点击的项目的工作。