2015-10-26 3 views
1

Я фактически реализую класс, который позволяет пользователю рисовать столько прямоугольников, сколько ему нужно, пока он нажимает мышь.Draw QGraphicsRectItems с отрицательными значениями

Вот код 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?

ответ

1

Если x или y из event->scenePos() становится ниже точки начала регулировки точки начала координат до самой верхней и самой левой точки и принимать положительное значение ширина:

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); 
} 
Смежные вопросы