enent事件是通过返回true或false,来决定是否传递事件,不能通过接受accept()或忽略ignore()
c.h文件
#ifndef C_H #define C_H #include <QPushButton> #include <QEvent> #include <QDebug> class C:public QPushButton { public: C(); bool event(QEvent* e); //重写event事件 }; #endif // C_H
c.cpp文件
#include "c.h" C::C() { } bool C::event(QEvent *e) { if(e->type()==QEvent::KeyPress) {qDebug()<<"C按下了键盘"; return 0; //返回false,将事件传递给父对象处理 } if(e->type()==QEvent::MouseButtonPress) {qDebug()<<"C按下了鼠标"; return 1; } //返回true,事件不传递给父对象 return QWidget::event(e); }
win.h文件
#ifndef WIN_H #define WIN_H #include <QWidget> #include <QDebug> #include "c.h" QT_BEGIN_NAMESPACE namespace Ui { class Win; } QT_END_NAMESPACE class Win : public QWidget { Q_OBJECT public: Win(QWidget *parent = nullptr); ~Win(); bool event(QEvent* e); private: Ui::Win *ui; C* mc; }; #endif // WIN_H
win.cpp文件
#include "win.h" #include "ui_win.h" Win::Win(QWidget *parent) : QWidget(parent) , ui(new Ui::Win) { ui->setupUi(this); mc=new C(); mc->setParent(this); mc->setText("AAA"); mc->move(22,22); resize(300,200); } Win::~Win() { delete ui; } bool Win::event(QEvent *e) { if(e->type()==QEvent::KeyPress) {qDebug()<<"win你按下了键盘"; } if(e->type()==QEvent::MouseButtonPress) {qDebug()<<"win你按下了鼠标"; } if(e->type()==QEvent::MouseButtonRelease) {qDebug()<<"你释放了鼠标"; } return QWidget::event(e); }
main.cpp代码
#include "win.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Win w; w.show(); return a.exec(); }
以上工程下载地址:链接:https://pan.baidu.com/s/17ULgzD3I8SfkrLC-eNbAEg 提取码:6666
事件的传递顺序
event()函数、事件过滤器、和事件处理函数的调用顺序如下:
首先按逆序调用事件过滤器,然后调用 event()函数,最后调用事件处理函数(注意:事件处理函数需在 event()函数中明确或间接调用,否则不会调用事件处理函数)。