用负值绘制 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()
的x
或y
变得低于原点调整原点到最上面和最左边的点并取正宽度值:
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);
}
我实际上是在实现一个 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()
的x
或y
变得低于原点调整原点到最上面和最左边的点并取正宽度值:
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);
}