我需要获取小部件内的鼠标移动:
使用事件过滤器不可行,因为它将安装在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事件也没有被注册。 重写的事件方法仍然没有被调用。
QObject
上安装事件过滤器:http://doc.qt.io/qt-5/qobject.html#installEventFilter。没有必要将对象移动到应用程序范围内。 - Nicolas Holthaus