Qt之事件系统(二)


一、事件系统

概念:事件----就是事情,大点的事情叫事件,再大的事情叫事变 1.1 事件相关的类 QEvent ----比较底层的基类 一般不直接用 QInputEvent: QKeyEvent ----常用 QMouseEvent ----常用 QTimerEvent ----常用 定时器事件 1.2 Qt中的常用事件 任何QObject子类----都可以 接收、处理 事件 如: 鼠标事件 QMouseEvent 上下文菜单事件 QContextMenuEvent 关闭事件 QClose 绘制事件 QPaintEvent 举例: 用鼠标单击 界面上的1个Button 鼠标事件 QMouseEvent ----鼠标发出的 单击信号 clicked() ----Button发出的 关键概念: 事件----信号 区别 如:鼠标发出鼠标事件;按钮发出clicked信号 但鼠标事件 又分为多种 事件类型,如单击、双击、移动 有枚举类型 QEvent::Type 注意: 我们一般只关心 信号 当需要设计 按钮时,才需要关心 事件 1.3 事件的执行顺序 知识点: keyPressEvent(QKeyEvent *event)----键盘按下事件 例子1:----父窗口、子窗口 都定义了相同的事件处理函数keyPressEvent,那么谁会被执行 编程步骤: 1、建立1个子窗口---- 通过点击项目右键----Add New----C++ Class 基类填 QLineEdit 2、在子窗口、父窗口的h cpp文件中,增加keyPressEvent事件处理函数 子窗口代码: 修改h文件: class MyLineEdit : public QLineEdit { public: MyLineEdit(); MyLineEdit(QWidget *parent=0); void keyPressEvent(QKeyEvent *event);//事件处理函数 }; 修改cpp文件: void MyLineEdit::keyPressEvent(QKeyEvent *event) { //qDebug()<<"keyPressEvent MyLineEdit is runed"; QLineEdit::keyPressEvent(event); event->ignore(); return; } 父窗口代码: 修改h文件: #include <QtCore> #include <QtGui> namespace Ui { class Event001Widget; } class Event001Widget : public QWidget { Q_OBJECT public: Event001Widget(QWidget *parent = 0); ~Event001Widget(); void keyPressEvent(QKeyEvent *event); private: Ui::Event001Widget *ui; }; 修改cpp文件 void Event001Widget::keyPressEvent(QKeyEvent *event) { qDebug()<<"keyPressEvent Event001Widget is runed"; //QWidget::keyPressEvent(event); return; } main.cpp文件如下: int main(int argc, char *argv[]) { QApplication a(argc, argv); Event001Widget w; MyLineEdit *myLineEdit=new MyLineEdit(&w); myLineEdit->move(100,100); myLineEdit->show(); w.show(); return a.exec(); } 重要结论: 1、运行后,在子窗口内 输入字符。 2、默认情况下,只有子窗口的事件处理函数被执行 3、在子窗口内,执行 event->ignore(); 则父窗口的事件处理函数才会被执行 4、默认情况下,输入的字符 是不可见的。解决办法:在子窗口的事件处理函数中增加语句QLineEdit::keyPressEvent(event); 1.4 event事件处理函数 编程步骤: 1、在子窗口中增加event事件处理函数 修改h文件: class MyLineEdit : public QLineEdit { public: MyLineEdit(); MyLineEdit(QWidget *parent=0); void keyPressEvent(QKeyEvent *event);//事件处理函数 bool event(QEvent *event); }; 修改cpp文件: bool MyLineEdit::event(QEvent *event) { if(event->type()==QEvent::KeyPress) { qDebug()<<"KeyPress_event MyLineEdit is runed"; } return QLineEdit::event(event); } 重要结论: 1、运行后,在子窗口内 输入字符。 2、先自动调用了event处理函数,再自动调用keyPressEvent处理函数 1.5 eventFilter处理函数 编程步骤: 1、在主窗口只能够,增加eventFilter处理函数 修改h文件: namespace Ui { class Event001Widget; } class Event001Widget : public QWidget { Q_OBJECT public: Event001Widget(QWidget *parent = 0); ~Event001Widget(); void keyPressEvent(QKeyEvent *event); bool eventFilter(QObject *object,QEvent *event); //新增加的 private: Ui::Event001Widget *ui; MyLineEdit *myLineEdit; //新增的 }; 定义cpp文件中的eventFilter函数: bool Event001Widget::eventFilter(QObject *object,QEvent *event) { if(object==myLineEdit) { if(event->type()==QEvent::KeyPress) { qDebug()<<"eventFilter is runed"; } } return QWidget::eventFilter(object,event); } 修改cpp中的构造函数 Event001Widget::Event001Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Event001Widget) { ui->setupUi(this); myLineEdit=new MyLineEdit(this); myLineEdit->move(100,100); myLineEdit->installEventFilter(this); } 修改main.cpp: int main(int argc, char *argv[]) { QApplication a(argc, argv); Event001Widget w; w.show(); return a.exec(); } 注意:即main函数中,不用再new MyLineEdit了,因为在Event001Widget类的构造函数中,已经完成了。 运行后,发现如下规律: 1、先执行主窗口的 eventFilter事件过滤器函数 2、再执行子窗口的 event事件函数 3、再执行子窗口的 keyPressEvent事件函数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章