Рисование пользовательского QGraphicsItem динамически с помощью мыши - PullRequest
0 голосов
/ 03 апреля 2020

Я хочу нарисовать собственный прямоугольник при перетаскивании с помощью событий мыши. Так как мне нужны дополнительные функции, такие как изменение размера прямоугольника, contextMenuEvents() и другие вещи, я вложил в подкласс QGraphicsObject и переопределил чисто виртуальные функции. Кроме того, у меня есть подкласс QGraphicsScene, который обрабатывает события мыши.

Что я хочу:

Чтобы иметь возможность рисовать собственный прямоугольник, когда события мыши запускаются на QGraphicsScene. Как и левой кнопкой мыши -> перетащить. Рисование это просто с помощью QGraphicsRectItem отлично работает.

Проблема:

Как установить boundingRect() моего пользовательского прямоугольника и paint () или обновить прямоугольник как мышь перемещается на QGraphicsScene?

В настоящее время у меня есть пустой подкласс RectItem. Что выглядит так:

RectItem::RectItem(QObject* parent) :
    QGraphicsObject()
{

}

QRectF RectItem::boundingRect() const
{
      // how to set bounding rect when rectangle is drawn dynamically using mouse?
}

void RectItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
     // how to update paint() and show a rectangle to the user?
}

До сих пор я использовал свой подкласс QGraphicsScene с QGraphicsRectItem. Событие мыши в качестве примера выглядит примерно так:

void ImageScene::mouseMoveEvent(QGraphicsSceneMouseEvent* event)
{
    if(m_sceneMode == RECT && event->buttons() == Qt::LeftButton)
    {
        if(!m_itemToDraw)
        {
            // how to initialize my RectItem here instead of QGraphicsRectItem?

            m_itemToDraw = new QGraphicsRectItem;
            m_itemToDraw->setPen(QPen(Qt::yellow, 3, Qt::SolidLine));
            m_itemToDraw->setPos(m_origPoint);

            // add the rect to the scene
            addItem(m_itemToDraw);
        }

        // set rect of the rectangle
        m_itemToDraw->setRect(0, 0,
                              event->scenePos().x() - m_origPoint.x(),
                              event->scenePos().y() - m_origPoint.y());

    }
    else
    {
        QGraphicsScene::mouseMoveEvent(event);
    }
}

Как реализовать boundingRect () и paint () для динамически изменяемого пользовательского элемента?

...