没有调用 mouseMoveEvent

mouseMoveEvent is not called

我需要在小部件内移动鼠标:

事件过滤器是不可能的,因为它将安装在 QApplication 上。小部件在类型层次结构中的位置很低。将此小部件传递给创建 QApplication 对象的主函数会使代码混乱。

因此我实现了

void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent * event);
void mouseMoveEvent(QMouseEvent *event);

在小部件中。

None 个事件被调用。 即使在中央小部件和我实际需要事件的小部件上都将 mousetracking 设置为 true,也不会调用这些函数:

centralWidget->setMouseTracking(true);

如何在 Qt 中为 QWidget 的自定义子类获取鼠标事件?

更新:这是.h文件:

class Plot : public QWidget
{
    Q_OBJECT
//...

protected:
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent * event);
    void mouseMoveEvent(QMouseEvent *event);

更新:

我尝试了 eventFilter 方法。

在.h文件中:

protected:
    void mousePressEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent * event);
    void mouseMoveEvent(QMouseEvent *event);

    bool eventFilter(QObject* object, QEvent* event);

在 .cpp 中:

void Plot::mousePressEvent(QMouseEvent *event){
//...
}
void Plot::mouseMoveEvent(QMouseEvent *event){

}
void Plot::mouseReleaseEvent(QMouseEvent *event){

}

bool Plot::eventFilter(QObject* object, QEvent* event)
{
    if(event->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent* mev=static_cast<QMouseEvent*>(event);

        qDebug()<<mev->x();
    }
   return false;
}

然后在我的 qWidget 的构造函数中:

this->installEventFilter(this);

代码编译并运行良好。 在事件过滤器中的 if 语句处设置断点停止程序,调用 eventFilter 方法。但是 if 语句永远不会被评估为真。即使是简单的 buttonPress 事件也没有注册。

事件的覆盖方法仍未调用。

bool someClass::eventFilter(QObject* object, QEvent* event)
{
    if(event->type() == QEvent::MouseMove)
    {
         mouseMoveFunction(static_cast<QMouseEvent*>(event))
    }
    // Repeat for other mouse events 

   // returning true blocks event returning false doesnt so if you want to block all mouse events except what your handling then return true inside each of your ifs
   return false;
}

然后将事件过滤器安装在您希望应用过滤器的任何地方,为此我假设您在 ui class 中,您会这样做(在构造函数中)

this->installEventFilter(this)

编辑:OP 正在使用 QCustomPlot,从以前的经验我知道这会消耗所有事件并且不会将它们传递回去,因此您必须连接到它发出的鼠标点击(或任何您想要的事件)信号其中的点或事件

我也需要在很深的层次结构中过滤鼠标事件,而上面的这个答案并没有完全适合我。我不得不花一个星期的时间来让事情正常进行。

您需要向 QCoreApplication 注册子 classed 小部件,但这无需遍历层次结构即可轻松完成。在 sub-classed 构造器中放置以下行:

QCoreApplication::instance()->installEventFilter(this);

您的子 class 现在将接收所有事件,只需过滤您需要的内容即可。


完整示例

头文件:

MouseMoveReaderBox : QScrollArea
{
    Q_OBJECT

public:
    explicit MouseMoveReaderBox(QWidget *parent = 0);
    ~MouseMoveReaderBox();

protected:
    bool eventFilter(QObject *obj, QEvent *event);
}

源文件:

#include "MouseMoveReaderBox"

MouseMoveReaderBox::MouseMoveReaderBox(QWidget *parent = 0)
    : QScrollArea(parent)
{
     QCoreApplicaiton::instance()->installEventFilter(this);
}

bool MouseMoveReaderBox::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::MouseMove)
    {
        // logic here...
        return true; // if you want to intercept
    }
    // Other event type checks here...
    return false; // the signal will be delivered other filters
}

希望这对您有所帮助,因为我知道我正在拔头发!