После некоторого прохождения документации я нашел другое решение.
В QGraphicsView
есть сигнал rubberbandChanged, содержащий только информацию, которую я хотел использовать. Таким образом, я справилась с ней в слоте, в результате чего в обработчик следующего вида:
void
MyImplementation::rubberBandChangedHandler(QRect rubberBandRect, QPointF fromScenePoint, QPointF toScenePoint)
{
// in default mode, ignore this
if(m_mode != MODE_RUBBERBANDZOOM)
return;
if(rubberBandRect.isNull())
{
// selection has ended
// zoom onto it!
auto sceneRect = mapToScene(m_prevRubberband).boundingRect();
float w = (float)width()/(float)sceneRect.width();
float h = (float)height()/(float)sceneRect.height();
setImageScale(qMin(w, h) * 100);
// ensure it is visible
ensureVisible(sceneRect, 0, 0);
positionText();
}
m_prevRubberband = rubberBandRect;
}
Для уточнения: моя реализация фокусируется на выбранном участке. Для этого класс содержит QRect
под названием m_prevRubberband
. Когда пользователь останавливает выбор с помощью резиновой ленты, параметр rubberBandRect
имеет значение NULL, и может использоваться сохраненное значение прямоугольника.
В связи с этим, для обработки событий мыши, не мешая обработке резинкой, m_prevRubberband
может использоваться как флаг (путем проверки его нулевого значения). Однако, если обработчик mouseReleaseEvent обрабатывается, проверка должна выполняться перед вызовом обработчика события по умолчанию, потому что он установит m_prevRubberband
на нуль прямоугольника.