2017-02-22 160 views
0

我想在拖動自定義小部件時將鼠標「卡」在QScrollArea內部。我使QScrollArea成爲一個名爲MyScrollArea的子類,因此我可以重新實現事件mouseMoveEvent。這是MyScrollArea子類:Qt 5.7如何限制小部件內部的鼠標移動

myscrollarea.h

#ifndef MYSCROLLAREA_H 
#define MYSCROLLAREA_H 

#include <QScrollArea> 
#include <QDebug> 
#include <QtGui> 

class MyScrollArea : public QScrollArea 
{ 
    Q_OBJECT 
public: 
    explicit MyScrollArea(QWidget *parent = 0); 

signals: 
    void changeLabel(QString); 

public slots: 

protected: 
    void leaveEvent(QEvent *event); 

    void mouseMoveEvent(QMouseEvent *event); 

private: 
    int mouseX, mouseY; 
}; 

#endif // MYSCROLLAREA_H 

myscrollarea.cpp

#include "myscrollarea.h" 

MyScrollArea::MyScrollArea(QWidget *parent) 
    : QScrollArea(parent) 
{ 
    this->setMouseTracking(true); 
    mouseX = 0; 
    mouseY = 0; 
} 

void MyScrollArea::leaveEvent(QEvent *event) 
{ 
    qDebug() << "LEFT!"; 
} 

void MyScrollArea::mouseMoveEvent(QMouseEvent *event) 
{ 
    mouseX = event->x(); 
    mouseY = event->y(); 
    event->accept(); 
    emit changeLabel(QString::number(mouseX) + ", " + QString::number(mouseY)); 
} 

即使鼠標跟蹤設置爲true,我只設法獲得mouseMoveEvent按鈕時保持。

我的問題是:

  1. 我如何mouseMoveEvent觸發器中的所有動作?
  2. 當他拖動我創建的自定義窗口小部件時,如何將光標設置到最後一個位置(位於「QScrollArea」內部)?
+0

您是否嘗試過實施mousePressEvent和mouseReleaseEvent? – eyllanesc

+0

不是。但是當我「抓住」自定義小部件(拖動它)以不允許部件移出QScrollArea時,我需要光標的位置。我如何使用mousePress和mouseRelease來做到這一點?當我點擊任何地方時,鼠標按下是否也會激活? – andseg

+0

嘗試eventFilter – eyllanesc

回答

0

怎麼樣使用EventFilter?步驟:

在你的widget安裝一個event filter

this->setMouseTracking(true); 
this->installEventFilter(this); 

重新實現eventFilter功能:

bool MyScrollArea::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (obj == this) { 
     if(event->type() == QEvent::MouseMove) { 
      QMouseEvent *mEvent = (QMouseEvent*)event; 
      // Use something like the viewPortSize to handle if the pos event is inside 
      if (over) { 
        // Mouse over Widget 
      } else { 
        // Mouse outside 
      } 
     } 
    } else { 
     return QScrollArea::eventFilter(obj, event); 
    } 
} 
+0

這是個好主意。正如eyllanesc指出的那樣。但是我不知道'event-> type()'是否是'QEvent :: MouseMove',因爲'mouseTracking'工作不正常。再次,這解決了我的第二個問題,但不是第一個問題。 – andseg

相關問題