没有调用 mouseMoveEvent
mouseMoveEvent is not called
我需要在小部件内移动鼠标:
事件过滤器是不可能的,因为它将安装在 QApplication 上。小部件在类型层次结构中的位置很低。将此小部件传递给创建 QApplication 对象的主函数会使代码混乱。
因此我实现了
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent * event);
void mouseMoveEvent(QMouseEvent *event);
在小部件中。
None 个事件被调用。
即使在中央小部件和我实际需要事件的小部件上都将 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 语句永远不会被评估为真。即使是简单的 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 class 中,您会这样做(在构造函数中)
this->installEventFilter(this)
编辑:OP 正在使用 QCustomPlot,从以前的经验我知道这会消耗所有事件并且不会将它们传递回去,因此您必须连接到它发出的鼠标点击(或任何您想要的事件)信号其中的点或事件
我也需要在很深的层次结构中过滤鼠标事件,而上面的这个答案并没有完全适合我。我不得不花一个星期的时间来让事情正常进行。
您需要向 QCoreApplication 注册子 classed 小部件,但这无需遍历层次结构即可轻松完成。在 sub-classed 构造器中放置以下行:
QCoreApplication::instance()->installEventFilter(this);
您的子 class 现在将接收所有事件,只需过滤您需要的内容即可。
完整示例
头文件:
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
}
希望这对您有所帮助,因为我知道我正在拔头发!
我需要在小部件内移动鼠标:
事件过滤器是不可能的,因为它将安装在 QApplication 上。小部件在类型层次结构中的位置很低。将此小部件传递给创建 QApplication 对象的主函数会使代码混乱。
因此我实现了
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent * event);
void mouseMoveEvent(QMouseEvent *event);
在小部件中。
None 个事件被调用。 即使在中央小部件和我实际需要事件的小部件上都将 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 语句永远不会被评估为真。即使是简单的 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 class 中,您会这样做(在构造函数中)
this->installEventFilter(this)
编辑:OP 正在使用 QCustomPlot,从以前的经验我知道这会消耗所有事件并且不会将它们传递回去,因此您必须连接到它发出的鼠标点击(或任何您想要的事件)信号其中的点或事件
我也需要在很深的层次结构中过滤鼠标事件,而上面的这个答案并没有完全适合我。我不得不花一个星期的时间来让事情正常进行。
您需要向 QCoreApplication 注册子 classed 小部件,但这无需遍历层次结构即可轻松完成。在 sub-classed 构造器中放置以下行:
QCoreApplication::instance()->installEventFilter(this);
您的子 class 现在将接收所有事件,只需过滤您需要的内容即可。
完整示例
头文件:
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
}
希望这对您有所帮助,因为我知道我正在拔头发!