事件过滤器和事件发送

 

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部件

 

 

 

#include "widget.h"
#include "ui_widget.h"
#include 
#include 

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

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

    QKeyEvent myEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier);
    qApp->sendEvent(ui->spinBox, &myEvent);           // 发送键盘事件到spinBox部件

}

Widget::~Widget()
{
    delete ui;
}

bool Widget::eventFilter(QObject *obj, QEvent *event) // 事件过滤器
{
    if (obj == ui->textEdit) {                        // 判断部件
        if (event->type() == QEvent::Wheel) {         // 判断事件
            // 将event强制转换为发生的事件的类型
            QWheelEvent *wheelEvent = static_cast(event);
            if (wheelEvent->delta() > 0) ui->textEdit->zoomIn();
            else ui->textEdit->zoomOut();
            return true;                              // 该事件已经被处理
        } else {
            return false;                // 如果是其他事件,可以进行进一步的处理
        }
    }
    else if (obj == ui->spinBox) {
        if (event->type() == QEvent::KeyPress) {
            QKeyEvent *keyEvent = static_cast(event);
            if (keyEvent->key() == Qt::Key_Space) {
                ui->spinBox->setValue(0);
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }
    else return QWidget::eventFilter(obj, event);
}

你可能感兴趣的:(QT)