2017-02-22 163 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

相关问题