Я хочу нарисовать собственный прямоугольник при перетаскивании с помощью событий мыши. Так как мне нужны дополнительные функции, такие как изменение размера прямоугольника, 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 () для динамически изменяемого пользовательского элемента?