2014-05-05 3 views
0

Мне нужно, чтобы мой QGraphicsView реагировал на выбор пользователя, т. Е. Менял отображение, когда пользователь выбирает область внутри него. Как я могу это сделать?Как извлечь выбранную область из QGraphicsView?

Насколько я могу судить, выбор в графическом каркасе Qt normaly работает с помощью выбора элементов. Я не нашел никаких методов/свойств, которые касаются выбранной области, за исключением QGraphicsVliew::rubberBandSelectionMode, что не помогает.

ответ

0

После некоторого прохождения документации я нашел другое решение.

В 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 на нуль прямоугольника.

0

Вы можете использовать qgraphicsscenemouseevent.

В поле MousePress сохранить текущее положение, а на MouseRelease вы можете вычислить ограничивающий прямоугольник с использованием текущего положения и положения MousePress.

Это дает вам выбранную область. Если вам нужны пользовательские фигуры, вы можете отслеживать движение мыши (MouseMove), чтобы получить форму.

Пример, который использует qgraphicsscenemouseevent, может быть найден here.

Смежные вопросы