我需要在小部件中获取鼠标移动:
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,根据以前的经验,我知道这会消耗所有事件,并且不会将它们传回来,所以你必须连接到它发出的鼠标点击(或任何你想要的事件(信号,其中包含点或事件