/* *事件过滤器不是类,仅仅是QObject类的两个函数:installEventFilter() 和 eventFilter() 。 *下面讲个例子: * 监视过滤 textEdit的鼠标滚轮事件;监视过滤 spinBox的 空格按键事件。 *2018.4.2 张洪铭 */ //widget.h public: bool eventFilter(QObject *watched, QEvent *event);
//widget.cpp #include <QWheelEvent> #include <QKeyEvent> //... //构造函数 ui->textEdit->installEventFilter(this); //this参数表明由本widget部件来负责对 textEdit 的监视和事件过滤 ui->spinBox->installEventFilter(this); //... bool Widget::eventFilter(QObject *watched, QEvent *event) { if( watched == ui->textEdit ){ //第一步:判断是否是被事件过滤器过滤的对象 if( event->type() == QEvent::Wheel ){ //第二部:判断是否是需要过滤的事件 QWheelEvent * wheelEvent = static_cast<QWheelEvent*>(event);//第三步:将event强制转换为发生的事件类型 if(wheelEvent->delta()>0) ui->textEdit->zoomIn(); else ui->textEdit->zoomOut(); return true; //!!!如果需要该事件继续被传递和被处理,返回true。这很重要!!!。 } else return false;//!!!如果不希望该事件继续被传递和被处理,返回false。这很重要!!!。 } else if( watched == 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 QWidget::eventFilter(watched,event); //最后:返回默认执行结果!!!。 }
[对比前后]
事件发送:
/* *Qt 还提供了 事件发送 的功能,是QCoreApplication类提供的。 * bool QCoreApplication::sendEvent(QObject * receiverObj,QEvent * event); * bool QCoreApplication::postEvent(QObject * receiverObj,QEvent * event,int priority = Qt::NorMalEventPriority); *区别: * sendEvent()立即处理事件;postEvent()把事件放到等待调度队列中。 * sendEvent()中的QEvent参数对象在事件发送后,自动删除,所以需要在栈上创建QEvent; * postEvent()中的QEvent参数对象必须new创建,事件发送后,由队列自动删除。 * * 下面提供一个例子:构造函数添加代码,实现想spinBox发送一个向上按钮触发事件。 */ QKeyEvent myEvent(QEvent::KeyPress,Qt::Key_Up,Qt::NoModifier);//第三个参数:没有任何修饰键按下 QApplication::sendEvent(ui->spinBox,&myEvent); //
[前后对比]