qpushbutton鼠标点击事件[br]折腾了半天发现,QPushButton自身会处理到鼠标左键的单击事件,即使你用了事件过滤器也不行![br]具体验证了三种情况:[br](1)QPushButton类会处理鼠标左键单击事件,不会再向父窗口传递,父窗口的eventFilter也无法捕捉这个事件。[br](2)同在一个窗口的QLabel可以在父窗口eventFilter被捕捉[br](3)继承QPushButton重新实现鼠标事件,还是不能被eventFilter捕捉,但是这样可以独立处理鼠标单击事件。[br]代码如下,有两种情况可以根据if、else进行选择编译:[br]1.dailog.h[br]void mousePressEvent(QMouseEvent *event); //注意这里不要写成(QKeyevent *event),否则接收不到鼠标事件[br]void mouseReleaseEvent(QMouseEvent *event); //注意这里不要写成(QKeyevent *event),否则接收不到鼠标事件[br]class myButton : public QPushButton[br]myButton(QWidget *parent = 0);[br]myButton(const QString &text, QWidget *parent = 0);[br]~myButton();[br]2.dialog.cpp[br]* QPushButton本身就相应鼠标的左键的单击事件![br]* 以下是两种情况来验证qt事件过滤器对于QPustButton的鼠标事件的影响:[br]* 1.直接使用QPushButton类;[br]/*运行程序,分别点击QPushButton按钮、QLabel按钮,通过打印可以看出事件过滤器对QPushButton的鼠标事件无法过滤,同在一[br]* 个窗口的QLabel鼠标事件却能够过滤,可见QPushButton对于鼠标事件进行了直接处理,过滤器无法拦截;QLabel的鼠标事件则可[br]* 以进行拦截。[br]QPushButton *btn = new QPushButton("QPushButton", this);[br]btn->resize(100,50);[br]btn->move(100,50);[br]QLabel *label = new QLabel("QLabel", this);[br]label->setStyleSheet("border:2px solid green;border-radius: 3px;background: #EEEEEE");[br]label->resize(100, 50);[br]label ->move(100,150);[br]//事件过滤器用法:A->installEventFilter(B)表示通过B中定义的事件过滤器来监控A,A是被监控者!//return true,不让它继续传递了,这样Dialog::mousePressEvent()就不会有打印;[br]//return false,事件将接着被送往剩下的事件过滤器或是目标对象进行处理,Dialog::mousePressEvent()有打印[br]return QObject::eventFilter(obj, event); //按照默认的处理方式继续传递[br]void Dialog::mousePressEvent(QMouseEvent *event) //注意这里不要写成(QKeyevent *event),否则接收不到鼠标事件[br]qDebug()<<"Dialog::mousePressEvent"<<event->type();[br]void Dialog::mouseReleaseEvent(QMouseEvent *event) //注意这里不要写成(QKeyevent *event),否则接收不到鼠标事件[br]myButton *btn = new myButton("Button",this);