赞
踩
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 <QKeyEvent>
- #include <QWheelEvent>
-
- 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<QWheelEvent*>(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<QKeyEvent*>(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);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。