用负值绘制 QGraphicsRectItem

Draw QGraphicsRectItems with negative values

我实际上是在实现一个 class,它允许用户在按下鼠标的同时绘制任意数量的矩形。

这里是 QGraphicsScene 处理这种情况的代码:

void ImageGraphicsSceneW::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
  origPoint=event->scenePos();
  qDebug()<<"origPoint="<<origPoint;
  mousePressed=true;

  QGraphicsScene::mousePressEvent(event);
}

void ImageGraphicsSceneW::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
  if(mousePressed==true){
    if(!rectangle){
      rectangle=new QGraphicsRectItem;
      this->addItem(rectangle);
      rectangle->setPen(QPen(Qt::red,4,Qt::SolidLine));
      rectangle->setPos(origPoint);
    }
    qDebug()<<"event.scenePos.x:"<<event->scenePos();
    rectangle->setRect(0,0,(event->scenePos().x()-origPoint.x()),
      (event->scenePos().y()-origPoint.y()));
  }
  else
    QGraphicsScene::mouseMoveEvent(event);
}

void ImageGraphicsSceneW::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
  rectangle=NULL;
  //buffer_rectangle(0,0,0,0);
  mousePressed=false;
  QGraphicsScene::mouseReleaseEvent(event);
}

但是,当我真正想要绘制具有负宽度和高度的矩形时,我遇到了一些问题。我的意思是当 origPoint.x()origPoint.y() 的值分别严格高于 scenePos().x()scenePos().y() 时。

你知道我该如何处理这个问题吗?我必须使用 QTransform class 吗?

如果event->scenePos()xy变得低于原点调整原点到最上面和最左边的点并取正宽度值:

void mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
  if(mousePressed==true){
    if(!rectangle){
      rectangle=new QGraphicsRectItem;
      this->addItem(rectangle);
      rectangle->setPen(QPen(Qt::red,4,Qt::SolidLine));
      rectangle->setPos(origPoint);
    }

    float top = qMin(origPoint.y(), event->scenePos().y());
    float left = qMin(origPoint.x(), event->scenePos().x());
    rectangle->setPos(left, top);
    rectangle->setRect(0, 0, qAbs(event->scenePos().x() - origPoint.x()),
      qAbs(event->scenePos().y() - origPoint.y()));

    qDebug() << top << left << origPoint << event->scenePos();
  }
  else
    QGraphicsScene::mouseMoveEvent(event);
}