【问题标题】:Qt - drag move qgraphicitem don't work niceQt - 拖动移动 qgraphicitem 不能正常工作
【发布时间】:2017-01-29 00:10:40
【问题描述】:

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

商品代码:

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

那么,我做错了什么?为什么应用会出现双击问题?

【问题讨论】:

  • 您有什么想在这里问的吗?
  • 谢谢,我忘了直接写问题。在我看来,我的连接错误运行=有关此的问题。现在我编辑帖子:)

标签: c++ qt graphics scene


【解决方案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) 可以完成选择用户点击的项目的工作。

【讨论】:

  • 谢谢你!我太傻了 :D 这工作很棒。对于后代:示例可能会误导,因为示例在错误按钮(但将项目移动到)时使用“裸”返回,并且下一个开关盒用于创建不同的对象。有点头晕。再次感谢:)
猜你喜欢
  • 2015-02-06
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2021-01-27
相关资源
最近更新 更多