mouseMoveEvent is not called



我需要在小部件中获取鼠标移动:

eventFilter是不可能的,因为它将安装在QApplication上。该小部件在类型层次结构中处于较低的位置。将这个小部件传递到创建QApplication对象的主函数会使代码混乱。

因此我实施了

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

在小部件中。

没有调用任何事件。即使在中央小部件和我实际需要事件的小部件上都将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语句从未被评估为true。即使是简单的buttonPress事件也没有注册。

事件的覆盖方法仍然没有被调用。

我也需要在深度heiarchy中过滤鼠标事件,而上面的这个答案对我来说并不太合适。我不得不做一个小粗花呢来让事情正常工作。

您需要向QCoreApplication注册子类小部件,但这可以在不遍历层次结构的情况下轻松完成。在子类别中,构作者写下以下行:

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

您的子类现在将接收所有事件,这只是筛选您需要的内容的问题。


完整示例

头文件:

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
}

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

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类中的,你会这样做(在构造函数中(

this->installEventFilter(this)

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

相关内容

  • 没有找到相关文章

最新更新