Как добавить элемент в QGraphicsScene? - PullRequest
1 голос
/ 03 августа 2011

Я пытаюсь добавить несколько пользовательских 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() &lt ePoint.x()) && (sPoint.y() &lt 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() &lt 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() &lt 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, а не сцене, поскольку в моем приложении сцена не охватывает весь вид. Но как я могу получить координаты сцены в моем случае?

1 Ответ

2 голосов
/ 03 августа 2011

Вы правы, координаты относятся к GraphicView, а не к сцене

Взято из документации Qt :

Возвращает позициюкурсор мыши относительно виджета, получившего событие.Если вы перемещаете виджет в результате события мыши, используйте глобальную позицию, возвращаемую globalPos (), чтобы избежать дрожания.

Надеемся, что они предоставляют вспомогательные функции ( выдержка изQGraphicsView doc ):

Вы также можете предоставить свое собственное взаимодействие со сценой, создав подкласс QGraphicsView и повторно реализовав обработчики событий мыши и ключа.Чтобы упростить программное взаимодействие с элементами в представлении, QGraphicsView предоставляет функции отображения mapToScene () и mapFromScene (), а также методы доступа к элементам items () и itemAt ().Эти функции позволяют отображать точки, прямоугольники, многоугольники и пути между координатами вида и координатами сцены, а также находить элементы на сцене, используя координаты вида.

Итак, функция, которую вы ищете, mapToScene () , который вы можете вызвать напрямую, потому что renderArea наследует от QGraphicsView

void renderArea::mousePressEvent(QMouseEvent *event)
{
    QPoint p = mapToScene(event->pos());
    updateList(p);
}

Редактировать: следите, mapToScene() возвращает QPointF, а не QPoint.Само по себе не проблема, но вы должны знать об этом.

...