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()函數中明確或間接調用,否則不會調用事件處理函數)。