37、三种事件处理方式优先级---------事件系统

张开发
2026/4/6 5:05:37 15 分钟阅读

分享文章

37、三种事件处理方式优先级---------事件系统
三种事件处理方式优先级我们学习了三种是事件处理方式1重写event函数2重写具体的事件函数3重写事件过滤器并安装那么这三种方式调用的顺序会怎么样呢我们还是在MainWindow中创建一个按钮然后用三种方式捕获这个按钮的点击事件并弹出对应的信息。看看触发顺序class MyButton: public QPushButton { Q_OBJECT public: //构造函数 explicit MyButton(const QString text, QWidget *parent nullptr): QPushButton(text,parent){ //装载事件过滤器 this-installEventFilter(this); } //重写鼠标点击事件 void mousePressEvent(QMouseEvent *e) override { QMessageBox::information(nullptr, mousePressEvent, mousePressEvent triggered!); return QPushButton::mousePressEvent(e); } //重写event事件 bool event(QEvent *e) override { //判断是鼠标按下事件 if(e-type() QEvent::MouseButtonPress){ QMessageBox::information(nullptr,event triggered, event MouseButtonPress triggered); //返回false表示未处理完全可以继续交给父节点处理鼠标按下事件 return false; } //不是鼠标按下事件可以调用基类处理方式 return QPushButton::event(e); } //重写事件过滤器 virtual bool eventFilter(QObject *watched, QEvent *event){ //判断是不是鼠标按下事件 if(event-type() QEvent::MouseButtonPress){ //弹出消息框表示事件过滤器捕获 QMessageBox::information(nullptr,eventFilter triggered, eventFilter MouseButtonPress triggered); //返回false表示未处理完全交给按钮的其他处理机制捕获 return false; } return QPushButton::eventFilter(watched, event); } };可以看到event中捕获了鼠标按下事件为了让事件继续抛给按钮的父节点处理我们选择了返回false。我们在main函数中调用int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; //创建按钮 auto button new MyButton(Click Me, w); button-setGeometry(100,100,100,50); w.show(); return a.exec(); }运行后点击按钮发现依次弹出两个信息框没有触发mousePressEvent函数可以看出触发的顺序是eventFilter, 然后才是event.那同学们思考下为什么没有触发mousePressEvent吗因为mousePressEvent是一个虚函数虚函数是通过基类指针调用进而调用子类实现的这是多态基类调用mousePressEvent也是通过基类的event进行派发的而我们看到在event处理函数中我们判断是鼠标点击事件后返回的是false也就不交给基类处理了导致无法通过基类调用派发子类功能。所以我们将event捕获到鼠标点击事件后不再直接返回而是继续调用基类QPushButton的event函数进而调用基类的mousePressEvent,最后通过多态效果触发我们自己实现的mousePressEvent//重写event事件 bool event(QEvent *e) override { //判断是鼠标按下事件 if(e-type() QEvent::MouseButtonPress){ QMessageBox::information(nullptr,event triggered, event MouseButtonPress triggered); //不返回继续调用基类的事件派发机制 } //不是鼠标按下事件可以调用基类处理方式 return QPushButton::event(e); }这样再次调用就能看到依次弹出三个消息框

更多文章