Qt 5.7 Как ограничить движение мыши внутри виджета

Я хочу, чтобы мышь «застряла» внутри QScrollArea, пока я перетаскиваю пользовательский виджет. Я сделал QScrollArea подклассом под названием MyScrollArea чтобы я мог переопределить событие mouseMoveEvent, Это MyScrollArea подкласс:

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

Решение

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

Установить фильтр событий в вашем виджете:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]