Я пытаюсь добавить несколько пользовательских QGraphicsItems в QGraphicsScene по щелчку мыши и по координатам курсора мыши. Но элементы не добавляются с такими же координатами, как у курсора мыши.
renderArea::renderArea(QWidget *parent):
QGraphicsView(parent)
{
scene = new QGraphicsScene(this);
scene->setItemIndexMethod(QGraphicsScene::NoIndex);
scene->setSceneRect(0, 0, 850, 480);
setScene(scene);
setCacheMode(CacheBackground);
setViewportUpdateMode(BoundingRectViewportUpdate);
setRenderHint(QPainter::Antialiasing);
setTransformationAnchor(AnchorUnderMouse);
scale(qreal(1.0), qreal(1.0));
setMinimumSize(400, 400);
}
void renderArea::mousePressEvent(QMouseEvent *event)
{
QPoint p = event->pos();
updateList(p);
}
void renderArea::updateList(const QPoint &p)
{
Point point;
point.point = p;
point.isSelected = false;
list.append(point);
if (list.size() > 1)
updateClothoid(list[list.size()-2].point, list[list.size()-1].point);
}
void renderArea::updateClothoid(const QPoint &p1, const QPoint &p2)
{
Clothoid *temp = new Clothoid(p1, p2);
clothoids.append(temp);
scene->addItem(temp);
}
renderArea - QGraphicsView, а Clothoids - пользовательский QGraphicsItem
Clothoid::Clothoid(QPoint startPoint, QPoint endPoint)
{
sPoint = startPoint;
ePoint = endPoint;
startCurvature = 0.0;
endCurvature = 0.0;
clothoidLength = sqrt(pow(endPoint.x() - startPoint.x(),2) +
pow(endPoint.y() - startPoint.y(),2));
}
QRectF Clothoid::boundingRect() const
{
qreal penWidth = 1;
if ((sPoint.x() < ePoint.x()) && (sPoint.y() < ePoint.y()))
return QRectF(sPoint.x(), sPoint.y(), ePoint.x() - sPoint.x(), ePoint.y()-sPoint.y())
.normalized()
.adjusted(-penWidth, -penWidth, penWidth, penWidth);
if ((sPoint.x() < ePoint.x()) && (sPoint.y() > ePoint.y()))
return QRectF(sPoint.x(), ePoint.y(), ePoint.x() - sPoint.x(), sPoint.y() - ePoint.y())
.normalized()
.adjusted(-penWidth, -penWidth, penWidth, penWidth);
if ((sPoint.x() > ePoint.x()) && (sPoint.y() < ePoint.y()))
return QRectF(ePoint.x(), sPoint.y(), sPoint.x() - ePoint.x(), ePoint.y()-sPoint.y())
.normalized()
.adjusted(-penWidth, -penWidth, penWidth, penWidth);
if ((sPoint.x() > ePoint.x()) && (sPoint.y() > ePoint.y()))
return QRectF(ePoint.x(), ePoint.y(), sPoint.x() - ePoint.x(), sPoint.y() - ePoint.y())
.normalized()
.adjusted(-penWidth, -penWidth, penWidth, penWidth);
return QRectF();
}
void Clothoid::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *)
{
QLineF line(sPoint, ePoint);
// Draw the line itself
painter->setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
painter->drawLine(line);
}
Я предполагаю, что координаты, в которые я вставляю элементы, принадлежат GraphicsView, а не сцене, поскольку в моем приложении сцена не охватывает весь вид. Но как я могу получить координаты сцены в моем случае?