我想在Qt中的自定义类的对象上安装事件过滤器。因此,我在Qt Designer上创建了一个项目,例如QtGuiApplication1
,并创建了一个简单的类myClass
,该类具有一个小部件和一个用于绘制彩色矩形的QGraphicsView。
在头文件中:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtGuiApplication1.h"
#include "myClass.h"
class QtGuiApplication1 : public QMainWindow
{
Q_OBJECT
public:
QtGuiApplication1(QWidget *parent = Q_NULLPTR);
private:
Ui::QtGuiApplication1Class ui;
bool eventFilter(QObject *obj, QEvent *ev);
myClass* myClass_;
};
.cpp
#include "QtGuiApplication1.h"
QtGuiApplication1::QtGuiApplication1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
myClass_ = new myClass(this, QRect(100, 100, 200, 200));
myClass_->installEventFilter(this);
}
bool QtGuiApplication1::eventFilter(QObject * obj, QEvent * ev)
{
if (obj == myClass_)
{
bool hi = true;
}
return false;
}
和myClass代码在这里:
myClass的头文件:
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
#include <QGraphicsView>
class myClass : public QObject
{
Q_OBJECT
public:
explicit myClass(QObject *parent = 0);
myClass();
myClass(QWidget* parent, QRect inRect);
private:
QWidget * widget;
QGraphicsView* qGraph_back;
QGraphicsScene* scene_back;
};
#endif /
myClass的cpp文件:
#include "myClass.h"
myClass::myClass(QObject *parent) :
QObject(parent)
{
}
myClass::myClass()
{
}
myClass::myClass(QWidget* parent, QRect inRect)
{
widget = new QWidget(parent);
qGraph_back = new QGraphicsView(widget);
scene_back = new QGraphicsScene(qGraph_back);
widget->setGeometry(inRect);
scene_back->setSceneRect(0,0,inRect.width(),inRect.height());
qGraph_back->setBackgroundBrush(QColor(0, 0, 255, 80));
qGraph_back->setScene(scene_back);
qGraph_back->show();
}
我想获取myClass_
对象的所有事件,例如鼠标事件,但是我不能,并且事件过滤器不起作用。如何在对象上安装eventfilter?
答案 0 :(得分:0)
事件过滤器仅适用于您的MyClass
实例中的事件。不适合孩子。
因此,在qGraph_back
方法中,eventFilter
中的事件(如鼠标单击或移动)将不可见。
在窗口小部件中添加子项时,会引发QChildEvent
事件。您可以使用它在所有子级(和子级等)上安装事件过滤器。但是,您必须在添加子项之前在MyClass
上安装事件过滤器。
一个简单的例子:
class Listener: public QObject
{
public:
Listener(): QObject()
{}
bool eventFilter(QObject* object, QEvent* event)
{
qDebug() << Q_FUNC_INFO << object << event;
if (event->type() == QEvent::ChildAdded)
{
QChildEvent* ev = dynamic_cast<QChildEvent*>(event);
ev->child()->installEventFilter(this);
}
return false;
}
};
class Widget: public QWidget
{
public:
Widget(QObject* parent) : QWidget()
{
installEventFilter(parent);
QGraphicsView* view = new QGraphicsView(this);
auto layout = new QHBoxLayout(this);
layout->addWidget(view);
layout->addWidget(new QLabel("Foobar"))
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Listener* listener = new Listener();
Widget* w = new Widget(listener);
w->show();
return app.exec();
}
如您所见,QLabel
中的事件现在已发送给侦听器。但是,您无法从视图中看到事件,因为它们被QGraphicsView
...
您必须处理添加的子项具有视口(来自QAbstractItemView
等的视口)并且情况变得更加复杂的情况。
因此,如果您必须知道用户何时单击视图,则使用信号/插槽而不是事件过滤器会更容易。