Qt:enterEvent 和 leaveEvent 不起作用

Posted

技术标签:

【中文标题】Qt:enterEvent 和 leaveEvent 不起作用【英文标题】:Qt: enterEvent and leaveEvent doesnt work 【发布时间】:2013-04-17 16:07:16 【问题描述】:

我对 Qt 中的鼠标事件有一个奇怪的问题。我有以下代码:

#ifndef QSTONEFIELD_HPP_
#define QSTONEFIELD_HPP_

#include <QtGui>
#include <QWidget>

class QStoneField : public QWidget

    Q_OBJECT

private:
    // some stuff

public:
    // some methods

protected:
    void paintEvent(QPaintEvent *event);   
    virtual void mousePressEvent(QMouseEvent * event);
    virtual void enterEvent(QMouseEvent * event);
    virtual void leaveEvent(QMouseEvent * event);

signals:

public slots:

;

#endif

在第二个文件中我有:

#include "qstonefield.hpp"
// FIXME temporary include
#include <iostream>
using namespace std;

// some other methods ..

void QStoneField::mousePressEvent(QMouseEvent * event)

    cout << "CLICK!" << endl << flush;


void QStoneField::enterEvent(QMouseEvent * event)

    cout << "ENTER!" << endl << flush;


void QStoneField::leaveEvent(QMouseEvent * event)

    cout << "LEAVE!" << endl << flush;

现在,当我编译并运行它时,我可以调用 mousePressEvent,因为程序会打印“CLICK!”,但是当我用鼠标穿过小部件时,它什么也不打印。 当然在 main.cpp 中我没有忘记 Stone.setMouseTracking(true)。

为什么 enterEvent 和 leaveEvent 不起作用?它应该根据文档工作。 提前致谢!

【问题讨论】:

【参考方案1】:

你的函数的签名应该是:

virtual void QStoneField::enterEvent(QEvent * event);
virtual void QStoneField::leaveEvent(QEvent * event);

您只是为函数使用了错误的参数,这意味着来自 Qwidget 的参数未被覆盖。

我建议您考虑一下默认实现的作用,例如:

virtual void QStoneField::leaveEvent(QEvent * event)
       //do my own things
       QWidget::leaveEvent(event);

【讨论】:

完美运行,谢谢!可能我有旧文档,因为有 QMouseEvent.. @Firzen 如果您使用了override,那么这将是编译时错误,而不是意外的运行时行为。

以上是关于Qt:enterEvent 和 leaveEvent 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

qtwidget鼠标放上去浮现button

qt中怎样实现ToolButtom控件的拖动效果

鼠标输入/离开处理程序2

AngularJS – 如何在 Jasmine 中为输入事件指令编写单元测试

鼠标插入/离开处理程序

添加鼠标移入移出事件