2017-02-22 42 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)); 
} 

Даже если отслеживание мыши установлен так, я только успел получить mouseMoveEvent когда кнопка Ручной.

Мой вопрос:

  1. Как сделать mouseMoveEvent курок во всех движениях?
  2. Как установить курсор на последнюю позицию (внутри «QScrollArea»), когда он перетаскивает пользовательский виджет, который я создал?
+0

Вы пытались реализовать mousePressEvent и mouseReleaseEvent? – eyllanesc

+0

Не совсем. Но мне нужно положение курсора, когда я «захвачу» пользовательский виджет (перетащить его), чтобы не позволить виджету перемещаться за пределами QScrollArea. как я могу это сделать, используя mousePress и mouseRelease? Не будет ли нажата кнопка мыши, когда я просто щелкнув в любом месте? – andseg

+0

попробуйте с eventFilter – eyllanesc

ответ

0

Как насчет использования EventFilter? Шаги:

Установите 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