2828QgsComposerMouseHandles::QgsComposerMouseHandles ( QgsComposition *composition ) : QObject( 0 ),
2929 QGraphicsRectItem( 0 ),
3030 mComposition( composition ),
31+ mGraphicsView( 0 ),
3132 mBeginHandleWidth( 0 ),
3233 mBeginHandleHeight( 0 ),
3334 mIsDragging( false ),
@@ -47,6 +48,29 @@ QgsComposerMouseHandles::~QgsComposerMouseHandles()
4748
4849}
4950
51+ QGraphicsView* QgsComposerMouseHandles::graphicsView ()
52+ {
53+ // have we already found the current view?
54+ if ( mGraphicsView )
55+ {
56+ return mGraphicsView ;
57+ }
58+
59+ // otherwise, try and find current view attached to composition
60+ if ( scene () )
61+ {
62+ QList<QGraphicsView*> viewList = scene ()->views ();
63+ if ( viewList.size () > 0 )
64+ {
65+ mGraphicsView = viewList.at ( 0 );
66+ return mGraphicsView ;
67+ }
68+ }
69+
70+ // no view attached to composition
71+ return 0 ;
72+ }
73+
5074void QgsComposerMouseHandles::paint ( QPainter* painter, const QStyleOptionGraphicsItem* itemStyle, QWidget* pWidget )
5175{
5276 Q_UNUSED ( itemStyle );
@@ -222,13 +246,11 @@ QRectF QgsComposerMouseHandles::selectionBounds() const
222246 return bounds;
223247}
224248
225- double QgsComposerMouseHandles::rectHandlerBorderTolerance () const
249+ double QgsComposerMouseHandles::rectHandlerBorderTolerance ()
226250{
227251 // calculate size for resize handles
228252 // get view scale factor
229- QList<QGraphicsView*> viewList = mComposition ->views ();
230- QGraphicsView* currentView = viewList.at ( 0 );
231- double viewScaleFactor = currentView->transform ().m11 ();
253+ double viewScaleFactor = graphicsView ()->transform ().m11 ();
232254
233255 // size of handle boxes depends on zoom level in composer view
234256 double rectHandlerSize = 10.0 / viewScaleFactor;
@@ -363,7 +385,24 @@ QgsComposerMouseHandles::MouseAction QgsComposerMouseHandles::mouseActionForScen
363385
364386void QgsComposerMouseHandles::hoverMoveEvent ( QGraphicsSceneHoverEvent * event )
365387{
366- setCursor ( cursorForPosition ( event->pos () ) );
388+ setViewportCursor ( cursorForPosition ( event->pos () ) );
389+ }
390+
391+ void QgsComposerMouseHandles::hoverLeaveEvent ( QGraphicsSceneHoverEvent * event )
392+ {
393+ Q_UNUSED ( event );
394+ setViewportCursor ( Qt::ArrowCursor );
395+ }
396+
397+ void QgsComposerMouseHandles::setViewportCursor ( Qt::CursorShape cursor )
398+ {
399+ // workaround qt bug #3732 by setting cursor for QGraphicsView viewport,
400+ // rather then setting it directly here
401+
402+ if ( !mComposition ->preventCursorChange () )
403+ {
404+ graphicsView ()->viewport ()->setCursor ( cursor );
405+ }
367406}
368407
369408void QgsComposerMouseHandles::mouseMoveEvent ( QGraphicsSceneMouseEvent* event )
@@ -472,7 +511,7 @@ void QgsComposerMouseHandles::mouseReleaseEvent( QGraphicsSceneMouseEvent* event
472511
473512 // reset default action
474513 mCurrentMouseMoveAction = QgsComposerMouseHandles::MoveItem;
475- setCursor ( Qt::ArrowCursor );
514+ setViewportCursor ( Qt::ArrowCursor );
476515 // redraw handles
477516 resetTransform ();
478517 updateHandles ();
0 commit comments