事件的传递过程
一. 事件的传递过程
- 事件被组件对象处理后可能传递到其父组件对象
二. QEvent中的关键成员函数
- 帮助手册中的描述
- 函数的功能
ignore():忽略当前事件,可能会传递给父组件
accept():接收者处理当前事件
isAccepted():判断当前事件是否被处理
三. 实验
-
实验
#ifndef MYLINEEDIT_H #define MYLINEEDIT_H #include <QLineEdit> class MyLineEdit : public QLineEdit { Q_OBJECT public: explicit MyLineEdit(QWidget *parent = 0); bool event(QEvent* e); void keyPressEvent(QKeyEvent* e); signals: public slots: }; #endif // MYLINEEDIT_H
#include "MyLineEdit.h" #include <QDebug> #include <QEvent> #include <QDebug> #include <QEvent> #include <QKeyEvent> MyLineEdit::MyLineEdit(QWidget *parent):QLineEdit(parent) { } //重写event处理函数 bool MyLineEdit::event(QEvent* e) { //如果是按键事件,则打印 if( e->type() == QEvent::KeyPress ) { qDebug() << "MyLineEdit::event"; } return QLineEdit::event(e); //调用父类的处理函数 } void MyLineEdit::keyPressEvent(QKeyEvent* e) { qDebug() << "MyLineEdit::keyPressEvent"; QLineEdit::keyPressEvent(e); // e->ignore(); }
#ifndef WIDGET_H #define WIDGET_H #include <QLineEdit> #include "MyLineEdit.h" #include <QWidget> #include "MyLineEdit.h" class Widget : public QWidget { Q_OBJECT MyLineEdit myLineEdit; public: Widget(QWidget* parent = 0); bool event(QEvent* e); void keyPressEvent(QKeyEvent* e); ~Widget(); }; #endif
#include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QEvent> #include <QDebug> #include <QEvent> #include <QKeyEvent> Widget::Widget(QWidget *parent) : QWidget(parent), myLineEdit(this) { } bool Widget::event(QEvent* e) { if( e->type() == QEvent::KeyPress ) { qDebug() << "Widget::event"; } return QWidget::event(e); } void Widget::keyPressEvent(QKeyEvent* e) { qDebug() << "Widget::keyPressEvent"; QWidget::keyPressEvent(e); } Widget::~Widget() { }
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }