当前位置:   article > 正文

事件过滤器和事件发送_事件过滤后处理事件

事件过滤后处理事件

 

QT中提供了事件过滤器来是现在一个部件中监控其他多个部件的事件。时间过滤器和其他部件不同,他不是一个类,只是由两个函数组成的一种操作,用来完成一个部件对其他部件的事件的监控。

 

这两个函数分别是QObject类中的函数。installEventFilter()和eventFilter()

 

 

要对一个部件是用事件过滤器,那么就要先使用其installEventFilter来为其安装过来不起,这个函数的参数表明了监视这个部件的一个对象。

    ui->textEdit->installEventFilter(this); //为编辑器部件在本窗口上安装事件过滤器

    ui->spinBox->installEventFilter(this);

 

当textEdit有事件发生后在编写eventFilter()事件处理器函数

bool Widget::eventFilter(QObject *obj, QEvent *event) // 事件过滤器

{

if (obj == ui->textEdit)

 

 else if (obj == ui->spinBox)

}

 

 

事件发送:

boolQCoreApplication::sendEvent(Qobject *receiver ,Qevent * event)

 

voidQCoreApplication::postEvent(Qobject *receiver ,Qevent *event, int priority=Qt::NormalEventPrioruty)

两种函数的主要区别:

1、sendEvent会立即处理给定的事件,而postEvent()则会将事件放到等待调度队列中,当下一次Qt的主事件循环运行时才会处理它。

2、sendEvent需要在栈上创建对象,在事件发送完后无法自动删除,而postevent必须堆上创建事件对象,事件发送完后自动删除。

调用形式:

 QKeyEventmyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);

    qApp->sendEvent(ui->spinBox, &myEvent);           //发送键盘事件到spinBox部件

 

 

 

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include <QKeyEvent>
  4. #include <QWheelEvent>
  5. Widget::Widget(QWidget *parent) :
  6. QWidget(parent),
  7. ui(new Ui::Widget)
  8. {
  9. ui->setupUi(this);
  10. ui->textEdit->installEventFilter(this); // 为编辑器部件在本窗口上安装事件过滤器
  11. ui->spinBox->installEventFilter(this);
  12. QKeyEvent myEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
  13. qApp->sendEvent(ui->spinBox, &myEvent); // 发送键盘事件到spinBox部件
  14. }
  15. Widget::~Widget()
  16. {
  17. delete ui;
  18. }
  19. bool Widget::eventFilter(QObject *obj, QEvent *event) // 事件过滤器
  20. {
  21. if (obj == ui->textEdit) { // 判断部件
  22. if (event->type() == QEvent::Wheel) { // 判断事件
  23. // 将event强制转换为发生的事件的类型
  24. QWheelEvent *wheelEvent = static_cast<QWheelEvent*>(event);
  25. if (wheelEvent->delta() > 0) ui->textEdit->zoomIn();
  26. else ui->textEdit->zoomOut();
  27. return true; // 该事件已经被处理
  28. } else {
  29. return false; // 如果是其他事件,可以进行进一步的处理
  30. }
  31. }
  32. else if (obj == ui->spinBox) {
  33. if (event->type() == QEvent::KeyPress) {
  34. QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
  35. if (keyEvent->key() == Qt::Key_Space) {
  36. ui->spinBox->setValue(0);
  37. return true;
  38. } else {
  39. return false;
  40. }
  41. } else {
  42. return false;
  43. }
  44. }
  45. else return QWidget::eventFilter(obj, event);
  46. }

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

闽ICP备14008679号