Qt事件处理(四)——重写event()函数
来源:互联网 发布:unity3d rpg 编辑:程序博客网 时间:2024/05/16 01:47
目录
- 目录
- 前言
- Qt的事件分发过程
- 重新实现event
- 代码
- 总结
前言
根据视频看的事件处理,但是没有顺序,所以有点乱!不过理解起来也不麻烦!学习!分享!感谢!
Qt的事件分发过程
在QApplication::exec()
的事件循环中,会不断判断事件的产生,然后把产生的事件分派给对应的控件。比如,在QPushButton
中产生了keyPressEvent()
事件,这时候QApplication::exec()
会把事件分派给QPushButton::event()
,而如果QPushButton::event()
忽略了keyPressEvent()
,QMainWindow::event()
可以选择是否对这个事件进行处理。
所以,如果我们想自己处理事件,我们可以重写QPushButton::event()
事件,也可以重写QPushButton::keyPressEvent()
从上图可以知道,我们的事件先会到达event()
函数,在这个函数中判断发生的事件是什么,然后转到对应的事件进行处理。
重新实现event()
重新实现event()可以在事件到达特定的事件处理器之前进行处理,使用情形如下:
覆盖Tab键的默认功能
就是如果一个事件对于整个控件都有效,我们可以使用重写event()没有特定事件处理器的不常用事件
如果一个事件,比如没有QPushButton::keyPressEvent()
这样的特定事件处理器,我们可以在event()
中进行处理。自定义事件
类似同上
代码
- main.cpp
#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){ QApplication a(argc, argv); Widget w; w.show(); return a.exec();}
- widget.h
#ifndef WIDGET_H#define WIDGET_H#include <QWidget>namespace Ui {class Widget;}class Widget : public QWidget{ Q_OBJECTpublic: explicit Widget(QWidget *parent = 0); ~Widget();private: Ui::Widget *ui;};#endif // WIDGET_H
- widget.cpp
#include "widget.h"#include "ui_widget.h"#include "mytextedit.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this); // ui have widget object, widget object is parent object of myTextEdit MyTextEdit *myTextEdit = new MyTextEdit(ui->widget); myTextEdit->setGeometry(0, 0, 260, 100);}Widget::~Widget(){ delete ui;}
- mytextedit.h
#ifndef MYTEXTEDIT_H#define MYTEXTEDIT_H#include <QTextEdit>class MyTextEdit : public QTextEdit{public: MyTextEdit(QWidget *parent=0);protected: bool event(QEvent* e);};#endif // MYTEXTEDIT_H
- mytextedit.cpp
#include "mytextedit.h"#include <QKeyEvent>#include <QEvent>#include <QtWidgets>MyTextEdit::MyTextEdit(QWidget *parent) : QTextEdit(parent){// QEvent e;}bool MyTextEdit::event(QEvent *e){ if(e->type() == QEvent::KeyPress) { QKeyEvent* keyEvent = (QKeyEvent*)e; if(keyEvent->key() == Qt::Key_Tab) { // Tab's function changed QMessageBox::information(this, tr("Test"), tr("MyTextEdit")); return false; // not refer to keyPressEvent(), we have deal with keyEvent } } return QTextEdit::event(e);}
- widget.ui
代码解析:
解析注意一:
我们知道在进行事件处理的时候,QApplication::exec()
函数会判断发生对应事件的是哪个控件,然后通过这个控件的event()
函数分发这个事件到下一级的event()
。比如QEvent::keyPress
事件,这个事件会从event()
事件传递到keyEvent()
中进行处理。
我们可以在传递的特定的事件处理器之前重写event()
函数来对这个事件进行处理,也可以选择重写特定
的事件处理器来进行处理。这里使用的就是重写event()
函数。当然只是重写对应的某个事件的处理函数。为了保证其他事件不被影响,我们需要在重写的函数中加入QTextEdit::event(e);
。
这里我们重写了QLineEdit
的Key_Tab
事件,这样的结构就是这个事件在event()
中进行处理了,而不会向下传递,如果需要传递ignore()
应该可行。解析注意二:
我们使用的Qt设计师来对控件进行布局,这时候我们由通过源代码的方式继承了QLineEdit
,如何把这个继承的控件加入到ui界面中?可以在ui
中添加一个widget
控件作为mytextedit
控件的父对象,这样就可以把控件加入的ui
界面中。当然我们也可以对控件使用提升法。参见: Qt小程序(四)-添加窗口部件到Qt Designer。代码结果
在继承的mytextedit
中按Tab
键会产生退出效果,同时会产生QMessageBox
。
总结
Qt中的事件处理方法和位置有很多,具体使用很灵活!了解的基础知识,剩下的才是真正的代码设计!所以,经济基础决定上层建筑!周六愉快!
- Qt事件处理(四)——重写event()函数
- 7-1 重写事件处理函数(Reimplementing Event Handlers)
- Qt 之路 (19)—事件(Event)
- C#委托四——事件event
- 第七章 Qt事件(event)处理
- 详解 QT Event 以及 Event Filter 事件处理
- Qt事件处理(四)
- event()函数 事件分发处理函数
- Qt提升子部件的办法&如何重写提升后部件的事件处理函数
- C语言回顾(四、字符串及其处理函数重写)——iOS开发基础
- QT Event事件收集
- QT event事件过滤器
- Jquery—事件event
- redis网络事件的特殊处理——stale event
- Qt事件处理(二)——事件处理链
- (4)事件处理——(10)事件处理上下文(Event handler context)
- Event处理(四)
- QT重写控件函数并添加鼠标单击事件
- 使用myeclipse搭建带maven的ava web项目(Spring+SpringMVC+Mybatis)
- 笔记整理之——转发和重定向
- mac系统下git使用笔记,仓库选用github
- MyEclipse中SVN分支合并到主干
- Android函数响应式编程——必学的RxJava创建操作符create、just、from、interval、range、repeat
- Qt事件处理(四)——重写event()函数
- 广东工业大学2017新生赛(决赛)-网络同步赛 1008 最小公倍数【暴力枚举】
- 《爱上WordPress系列教程》导航篇
- C++ 创建指定大小的空白文件
- CodeForces500c
- 数据挖掘学习------------------1-数据准备-3-数据预处理
- 数据结构-堆
- 浅析Linux Radix-Tree
- KEIL Study logs