我需要在小部件内部进行鼠标移动:
无法使用eventFilter,因为它将安装在QApplication上。窗口小部件在类型层次结构中很远。将此窗口小部件传递给创建QApplication对象的主函数会使代码陷入混乱。
因此我实施了
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent * event);
void mouseMoveEvent(QMouseEvent *event);
小部件中的。
没有调用任何事件。 即使在中央窗口小部件和我实际需要事件的窗口小部件上将鼠标跟踪设置为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方法。
<。>文件中的:
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事件也没有注册。
仍然没有调用事件的覆盖方法。
答案 0 :(得分:2)
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,根据之前的经验,我知道这会消耗所有事件并且不会将它们重新传递回来,因此您必须连接到鼠标点击(或任何您想要的事件)信号,它会发出点或者其中的事件
答案 1 :(得分:0)
我也需要在深度heiarchy中过滤鼠标事件,上面的答案对我来说并不是很有用。我不得不做一个小小的调整来让事情发挥作用。
您需要使用QCoreApplication注册子类小部件,但这可以在不遍历层次结构的情况下轻松完成。在分类建议员中提出以下内容:
QCoreApplication::instance()->installEventFilter(this);
您的子课程现在将收到所有活动,只需过滤您需要的内容。
下面的完整示例
Header File:
MouseMoveReaderBox : QScrollArea
{
Q_OBJECT
public:
explicit MouseMoveReaderBox(QWidget *parent = 0);
~MouseMoveReaderBox();
protected:
bool eventFilter(QObject *obj, QEvent *event);
}
Source File:
#include "MouseMoveReaderBox"
MouseMoveReaderBox::MouseMoveReaderBox(QWidget *parent = 0):
QScrollArea(parent)
{
QCoreApplicaiton::instance()->installEventFilter(this);
}
MouseMoveReaderBox::eventFilter(QObject *obj, QEvent *event)
{
if(event.type() == QEvent::MouseMove)
{
// logic here...
}
// Other event type checks here...
}
希望这有帮助,因为我知道我正在拔头发!