2010-09-16 173 views
1

問候所有,QT鼠標事件處理問題

如在圖像

http://i51.tinypic.com/2r56s1j.jpg

看出我具有延長QWidget的對象(其繪製細胞的圖像和一些countour數據)一個QScrollBar內部。 用戶可以使用鼠標滾輪放大/縮小圖像(QWidget大小根據QImage的縮放大小而改變)。

我通過在QWidget中實現偵聽器方法來處理事件(mouseMoveEvent(),wheelEvent()等)。 我的問題是,當鼠標指針位於QWidget上時,我只能執行縮放(和其他事件)。 如果鼠標點位於QScrollBar(圖像中的灰色區域)上,那麼這些事件將被QScroolBar使用。

任何提示,

[編輯]抱歉,我指的QScrollArea,不QScrollBar。

感謝, umanga

+0

有兩個問題。你的意思是QScrollArea而不是QScrollBar?你是否想要滾動條響應滾輪? – 2010-09-16 05:14:16

+0

對不起,是的,它的QScrollArea。是的,實際上我想使用滾動條來移動可見區域。 – 2010-09-16 05:16:17

回答

1

我不確定,如果你想滾輪曾經被用於縮放圖像,或者如果你想滾輪來控制,當圖像比滾動區域視小放大,然後使用滾動當圖像大於滾動區視口時滾輪進行滾動。在任何一種情況下,您都應該能夠自定義如何使用以下方式處理車輪:

由於我沒有真正嘗試過這個,我不確定它是否會起作用。希望如果您安裝了事件過濾器並將事件設置爲忽略,該事件仍將傳播回您的圖像小部件。這將允許您保留當前在圖像小部件中的鼠標處理完好無損。

bool YourImageWidget::eventFilter(QObject *obj, QEvent *event) 
{ 
    if((obj == scrollAreaPointer) && (event->type() == QEvent::Wheel)) 
    { 
     if(!scrollAreaShouldHandleWheel) 
     { 
      event->ignore(); 
     } 
    } 
    return false; // always pass the event back to the scroll area 
} 

scrollAreaShouldHandleWheel標誌,你會根據您是否希望滾動區域來處理滾輪事件設定從圖像構件一個布爾值。

在代碼中的某處,您將安裝圖像小部件作爲scrollarea的事件過濾器。

scrollArea->installEventFilter(imageWidget); 

如果這不起作用,你可以隨時使用這個過濾器,確保你的widget獲取事件,並直接處理它,然後返回true,這樣滾動區域將無法接收事件。

+0

阿諾德,非常感謝你的答案。我會試試這個。 – 2010-09-16 07:44:18

1

我建議你使用QGraphicsScene和的QGraphicsView。圖形框架已經提供了很多有用的功能(包括視口轉換)。 QGraphicsView是一個滾動區域。

0

對於Qwidget,您是否完成了grabMouse(),即您顯示圖像的那個?

+0

是的,我試過了,如果我調用grabMouse(),其他控件沒有響應。 – 2010-09-16 06:23:56

+0

你忽略了你在QScrollArea上收到的事件。我的意思是說事件 - >忽略() – Naruto 2010-09-16 09:25:03