【问题标题】:Qt 5.7 How to restrict mouse movement inside a widgetQt 5.7 如何限制小部件内的鼠标移动
【发布时间】:2017-07-12 23:20:39
【问题描述】:

当我拖动自定义小部件时,我希望鼠标“卡”在 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”内)?

【问题讨论】:

  • 你有没有尝试实现mousePressEvent和mouseReleaseEvent?
  • 并非如此。但是当我“抓取”自定义小部件(拖动它)以不允许小部件移动到 QScrollArea 之外时,我需要光标的位置。如何使用 mousePress 和 mouseRelease 做到这一点?当我单击任意位置时,鼠标按下不会激活吗?
  • 尝试使用 eventFilter
  • 这将解决我的第二个问题。但我真的很想知道为什么“mouseMoveEvent”没有触发。我会尝试使用事件过滤器
  • 您正在寻找鼠标跟踪:您必须启用它。

标签: c++ qt restrictions


【解决方案1】:

使用 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);
    }
}

【讨论】:

  • 这是个好主意。正如 eyllanesc 所指出的那样。但是我不知道event-&gt;type() 是否是QEvent::MouseMove,因为mouseTracking 工作不正常。同样,这解决了我的第二个问题,但不是第一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多