2017-02-22 4 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을 구현하는 시도 해 봤나 :

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

eventFilter 기능을 다시 구현? – eyllanesc

+0

아닙니다. 그러나 위젯이 QScrollArea 외부로 이동하지 못하도록 사용자 정의 위젯을 "잡아"드래그 할 때 커서 위치가 필요합니다. mousePress 및 mouseRelease를 사용하면 어떻게 할 수 있습니까? 아무 곳이나 클릭하면 마우스 누르기도 활성화되지 않습니까? – andseg

+0

try with eventFilter – eyllanesc

답변

0

EventFilter는 어떻게 사용합니까? 단계 :

이 위젯에 event filter를 설치

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이 지적한 것과 똑같습니다. 그러나'mouseTracking'이 제대로 작동하지 않기 때문에'event-> type()'이'QEvent :: MouseMove'인지 알 수 없습니다. 다시 말하지만, 이것은 두 번째 문제를 해결하지만 첫 번째 문제는 해결하지 못합니다. – andseg

관련 문제