C++ Qt-拖动移动qgraphicsitem don';工作不好

C++ Qt-拖动移动qgraphicsitem don';工作不好,c++,qt,graphics,scene,C++,Qt,Graphics,Scene,我的简单代码基于Qt标准示例“图表场景”。主窗口最简单,只加载自定义场景。用户界面是在图形编辑器中生成的。 拖动和移动图形多边形使用鼠标右键,左键创建新项目。所以 我必须双击该项目以选择它。项目需要双击,无需释放上次单击,当我想要移动项目时。他头晕目眩 项目代码: BasicDiagramItem::BasicDiagramItem(QGraphicsItem *parent): QGraphicsPolygonItem(parent) { drawCustomPoly(); }

我的简单代码基于Qt标准示例“图表场景”。主窗口最简单,只加载自定义场景。用户界面是在图形编辑器中生成的。 拖动和移动图形多边形使用鼠标右键,左键创建新项目。所以 我必须双击该项目以选择它。项目需要双击,无需释放上次单击,当我想要移动项目时。他头晕目眩

项目代码:

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示例相似。我只是不使用模式创建不同的对象,不使用自定义菜单,也不绘制箭头

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

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

我想这就是原因:

void DiagramScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
{
   if(mouseEvent->button() != Qt::RightButton) return;
请注意,只需单击鼠标左键,MousePresseEvent()就会返回,而不做任何操作;这就解释了为什么单击鼠标左键时什么也没发生。(双击OTOH时,会调用mouseDoubleClickEvent(),因为您尚未重写mouseDoubleClickEvent(),因此会调用qgraphicscene::mouseDoubleClickEvent()方法并在此处处理单击

我想你要做的是:

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

   [...]

通过这种方式,QGraphicscene::MousePresseEvent(mouseEvent)可以选择用户单击的项目。

这里有你想问的问题吗?Thx,我忘记了直接写问题。在我看来,我有连接错误运行=关于此的问题。现在我编辑帖子:)谢谢!我太笨了:这工作太棒了。对于后代:示例可能会产生误导,因为示例在错误按钮(但将项目移动到)和下一个切换框时使用“裸”返回来创建不同的对象。有点头晕。再次感谢:)