Нужно создать класс, который действовал бы аналогично QRubberBand. То есть чтобы его можно было создавать во вьюпорте View и изменять его параметры (размер, позицию), не заботясь о его перерисовке (чтобы он при этом сам перерисовывался).
Можете привести пример для, например, эллписа (и чтоб описывался он, по традиции Qt, как QRect). Использовать хочется по некоторой аналогии с QRubberBand:
В хедере View делаю:
QPoint m_origin;
AbstractRubberBand* m_rubberband;
И используется в этом View оно так:
void Widget::mousePressEvent(QMouseEvent *event)
{
m_origin = event->pos();
if (m_rubberband == NULL) {
m_rubberband = new (m_instrument == Ellipse ? EllipseRubberBand(this) : RectangleRubberBand(this) );
}
m_rubberband->setGeometry(QRect(origin, QSize()));
m_rubberband->show();
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
if (m_rubberban != NULL) {
m_rubberband->setGeometry(QRect(origin, event->pos()).normalized());
}
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
if (m_rubberban != NULL) {
m_rubberband->hide();
// делаем что надо с полученной фигурой и удаляем m_rubberband
}
}
Также нужен инструмент полигональной линии — в него последовательно (сигналами или ещё как) отправляются QPointF'ы или сигналы изменения позиции одного из его точек, потом опять же прячем его, получаем shape и удаляем его.
От чего танцевать, что наследовать?