当前位置:   article > 正文

事件处理(事件过滤器)_“专病”+“事件过滤”

“专病”+“事件过滤”

事件过滤器(eventFliter)

  • Qt提供了事件过滤器来在一个部件中监控其他多个部件的事件。
  • 事件过滤器与其他部件不同,他不是一个类。
  • 只是由两个函数组成的一种操作,用来完成一个部件对其他部件的事件的监视!
  • 这两个函数分别是installEventFilter()和eventFilter()
  • 他们都是QObject类中的函数。
  • 使用事件过滤器可以很容易的处理多个部件的事件

 

来点实战:

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4. QMainWindow(parent),
  5. ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. // 为子部件安装事件过滤器(其实就是允许父窗口监视自己)
  9. ui->textEdit->installEventFilter(this);
  10. ui->spinBox->installEventFilter(this);
  11. }
  12. MainWindow::~MainWindow()
  13. {
  14. delete ui;
  15. }
  16. bool MainWindow::eventFilter(QObject *watched, QEvent *event)
  17. {
  18. // 监视 textEdit 子部件的事件
  19. if(watched == ui->textEdit)
  20. {
  21. // 监视 textEdit 子部件的 wheel 事件
  22. if(event->type() == QEvent::Wheel)
  23. {
  24. QWheelEvent *wheelEvt = static_cast<QWheelEvent*>(event);
  25. if(wheelEvt->delta() > 0)
  26. {
  27. ui->textEdit->zoomIn();
  28. }
  29. if(wheelEvt->delta() < 0)
  30. {
  31. ui->textEdit->zoomOut();
  32. }
  33. // 不允许事件的继续传递
  34. // 阻断事件的传递
  35. return true;
  36. }
  37. }
  38. // 监视 spinBox 子部件的事件
  39. if(watched == ui->spinBox)
  40. {
  41. // 监视 spinBox 子部件的键盘按下事件
  42. if(event->type() == QEvent::KeyPress)
  43. {
  44. QKeyEvent *keyEvt = static_cast<QKeyEvent*>(event);
  45. if(keyEvt->key() == Qt::Key_M)
  46. {
  47. ui->spinBox->setValue(99);
  48. }
  49. }
  50. return true;
  51. }
  52. return QMainWindow::eventFilter(watched,event);
  53. }

MainWindow里的 eventFliter 监视着 textEdit 和 spinBox 的事件,所以完全可以在 MainWindow 里面阻断/处理所有子部件的所有类型的消息!

 

参考:

不二如是:https://fishc.com.cn/forum.php?mod=viewthread&tid=77543&ctid=447

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/573938
推荐阅读
相关标签
  

闽ICP备14008679号