1. 程式人生 > >QGraphicsView 更改滑鼠樣式 以及QGraphicsItem懸停時更改滑鼠樣式

QGraphicsView 更改滑鼠樣式 以及QGraphicsItem懸停時更改滑鼠樣式

一個編輯區域,用QGraphi引數View寫的,可以放大,滑鼠按下後可以拖拽檢視,這個時候希望滑鼠可以是"小手"抓取的樣子.QGraphicsView上有一些個QGraphicsItem,希望滑鼠懸停在item上時可以變成四向箭頭,然後可以拉伸item.

所以重新了QGraphicsView的

void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);

三個方法,並在其中寫了判斷,

if (m_bDrag)

{
this->setCursor(Qt::OpenHandCursor);
}

QGraphicsItem重寫了

void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void hoverMoveEvent(QGraphicsSceneHoverEvent *event);

方法,並且也在其中添加了判斷,

if (m_bHover)
{
this->setCursor(Qt::SizeAllCursor);
}

但是在執行的時候並沒有按照預想的執行,當QGraphicsView中未新增Item的時候,可以顯示"小手"的拖拽游標,也可以進行圖示切換,但是當新增過item後,

雖然也執行了view中改變滑鼠樣式的函式,但是並沒有效果,當滑鼠懸停在Item上方的時候,滑鼠樣式發生改變.

分析了一下,this->setCursor(Qt::OpenHandCursor);和this->setCursor(Qt::SizeAllCursor);的this並不是一個物件,this是View物件,而this是item物件,

所以在Item的懸停方法中,我改成這樣

void MytItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
{
if (m_bHover)
{

// 獲取當前item所屬於的scene,然後獲取scene的Views,因為我只有一個View,所以用下標at(0)獲取了view

QGraphicsView * view = this->scene()->views().at(0);

// 然後用view設定滑鼠樣式
view->setCursor(Qt::SizeAllCursor);
}
QGraphicsItem::hoverMoveEvent(event);
}

問題解決,在查詢的時候,發現有一篇部落格這樣寫,但是還未驗證

解決方法就是在QGraphicsView子類中使用viewport()->setCursor()而不是直接的setCursor(),這樣才能真正改變視覺上的滑鼠形狀。viewport()函式定義在QAbstractScrollArea類中,QGraphicsView繼承自QAbstractScrollArea類,對於更新更新檢視內容應該用viewport()->update(),而不是直接用update()。

http://blog.csdn.net/afterward___/article/details/46408355