我需要在小部件内部进行鼠标移动:
无法使用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方法.
在.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事件也没有注册.
仍未调用事件的覆盖方法.
最佳答案
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,根据之前的经验,我知道这会消耗所有事件并且不会将它们备份,所以你必须连接到鼠标点击(或任何你想要的事件)信号它发出的点或事件