2012-06-21 19 views
0

我是QGraphicsView的子類,我想要做的是:如果在鼠標移動時按下MidButton,那麼我們會像使用常規QGraphicsView操作過程那樣做,但與按下左側按鈕即可滑動圖像。子類化QGraphicsView,自定義鼠標事件

我試過編碼,但它似乎不工作,我不知道爲什麼。

void MyQGraphicsView::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->buttons() == Qt::MidButton) 
    { 
     QMouseEvent event2(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::LeftButton, Qt::NoModifier); 
     QGraphicsView::mouseMoveEvent(&event2); 
    } 
} 

任何幫助,將不勝感激。

編輯:刪除安東尼指出的明顯錯誤。

回答

2

有幾個問題。首先,測試條件應該使用testFlags而不是==。其次,您創建的事件爲Qt::MidButton,它應該是Qt::LeftButton。最後,你還需要爲mousePressEvent做一個類似的測試(以便QGraphicsView可以知道啓動手拖)。

void mousePressEvent(QMouseEvent *event) 
{ 
    if (event->buttons().testFlag(Qt::MidButton)) 
    { 
     QMouseEvent event2(QEvent::MouseButtonPress, event->pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); 

     // do default behavior as if you pressed the left button 
     QGraphicsView::mousePressEvent(&event2); 
    } 
    else 
    { 
     QGraphicsView::mousePressEvent(event); 
    } 
} 
void mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->buttons().testFlag(Qt::MidButton)) 
    { 
     QMouseEvent event2(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::LeftButton, Qt::NoModifier); 

     // do default behavior as if you pressed the left button 
     QGraphicsView::mouseMoveEvent(&event2); 
    } 
    else 
    { 
     QGraphicsView::mouseMoveEvent(event); 
    } 
} 
+0

這是我的代碼的時刻:'如果(事件 - >按鈕()testFlag(QT :: MidButton)){QMouseEvent事件2(QEvent的:: MouseMove事件,事件 - > pos(),Qt :: NoButton,Qt :: LeftButton,Qt :: NoModifier); QGraphicsView :: mouseMoveEvent(&event2);}'它沒有做我想做的事情,但測試看起來不錯,因爲它沒有做我已經放在'elif'之後,我確定是加工。 – Leo

+0

@Leo我只用橡皮筋拖動來測試它。事實證明,用滾動手拖動,你也需要重新實現mousePressEvent。查看修改。 – Anthony

+0

謝謝,它現在起作用,唯一的問題是我不得不按下一個新按鈕來使這種行爲停止,只是釋放Midbutton是不夠的。 – Leo

0

你似乎正在瞄準的是將「手拖」模式的觸發按鈕從左按鈕更改爲中按鈕。

雖然事件更改方法有效,但它存在一些問題:當QGraphicsView處於「手動拖動」模式時,它仍會傳播左鍵單擊,然後再拖動到場景/項目。這意味着如果您在不拖動的情況下進行中間點擊和釋放,它會認爲您左鍵點擊了,並且沒有拖動地發佈。你將有效地觸發左鍵點擊到現場。

你可以改寫中間點擊的行爲來直接滾動場景。此代碼從QGraphicsView::mouseMoveEvent()拍攝:

void View::mousePressEvent(QMouseEvent *event) 
{ 
    _lastPos = event->pos(); 
    QGraphicsView::mousePressEvent(event); 
} 

void View::mouseMoveEvent(QMouseEvent *event) 
{ 
    if (event->buttons().testFlag(Qt::MidButton)) 
    { 
     QScrollBar *hBar = horizontalScrollBar(); 
     QScrollBar *vBar = verticalScrollBar(); 
     QPoint delta = event->pos() - _lastPos; 
     _lastPos = event->pos(); 
     hBar->setValue(hBar->value() + (isRightToLeft() ? delta.x() : -delta.x())); 
     vBar->setValue(vBar->value() - delta.y()); 
    } 
    QGraphicsView::mouseMoveEvent(event); 
}