知识点1:事件概述
事件经过以下:事件派发--->事件过滤器------>事件分发------>事件处理四个阶段
事件:系统或 Q t 本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,说是窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件在对用户做出操作做出响应时发出,如键盘事件,另一些事件则是由系统自动发出,如计时器事件。
在前面我们也曾经简单提到,Q t 程序需要在main()函数创建一个QApplication对象,然后调用,它的exec()函数,这个函数就开始QT的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序事件。当事件发生时,QT将创建一个事件对象,QT中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt将这个事件对象传递给QObject的even()函数(事件分发函数)。event函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler),关于这一点,后面会详细说明。
在所有组件的父类QWidget中,定义了很多事件处理的回调函数,如
事件循环开始:exec()函数是事件循环的开始。
知识点2:常见事件函数
帮助文档:
知识点3:重写窗口关闭,窗口重新设置大小事件
上面介绍的常用函数中关键词 virtual 是虚函数的意思。虚函数是可以被重载的。
步骤1:新增一个类继承于QWidget(新建工程 )。
步骤2:子类声明重写的事件函数
protected:
void closeEvent(QCloseEvent*event);
void resizeEvent(QResizeEvent*event);
步骤3:在子类的.cpp去实现事件函数。
void Widget::closeEvent(QCloseEvent *event)
{
int ret=QMessageBox::question(this,"提示","您确定要关闭窗口吗?");
if(ret==QMessageBox::Yes){
event->accept();
}
else {
event->ignore();
}
}
void Widget::resizeEvent(QResizeEvent *event)
{
qDebug()<<"oldsize="<<event->oldSize();
qDebug()<<"newsize="<<event->size();
}
知识点4:鼠标按下,释放,移动事件
步骤1:新建label类继承QLabel(新建工程,ui绘制label,新增C++类QWiget,代码修改继承QLabel,ui绘制label提升新创建label类)
步骤2:查看帮助文档
步骤3:在mylabel.h声明事件函数
步骤4:在mylabel.cpp实现事件函数
知识点5:重写事件分发函数(了解)
案例:键盘事件:监听tab按键
步骤1:.h声明event
步骤2:.cpp实现event函数
注意:
1、事件分发函数的返回值bool。
2、我们处理自己感兴趣的事件之后,可以直接返回true,表示我们已经对此事件进行了处理;对于其他我们不关心的事件,则需要调用父类的event()函数继续转发,否则这个组件就只能处理我们定义的事件了。
知识点6:事件过滤器(了解)
有时候,对象需要查看、甚至要拦截发送到另外对象的事件。例如,对话框可能想要拦截按键事件,不让别的组件接收到;或者要修改回车建的默认处理。
-------------------------------------------------------------------------------------------------------------------------------
使用:重写
步骤1:声明
virtual bool QObject::eventFilter(QObject*watched,QEvent*event);
步骤2:实现(先判断是否是要过滤事件的组件,如果是要过滤的组件,再去判断事件是否过滤,如果过滤返回true,如果不过滤返回false;如果不是要过滤事件的组件,返回父类的事件过滤函数)
步骤3:安装
void QObject::installEventFilter(QObject*filterObj)
步骤4:移除
void QObject::removeEventFilter (QObject*filterObj)
知识点7:事件总结
事件处理有以下四个过程:
事件处理:重写鼠标按下事件、鼠标释放事件,这个是最简单的形式及功能。
事件分发:重写event函数。event函数是所有对象的事件的入口。
事件过滤:重写eventFiler,过滤特定对象的事件,或者所有对象的所有事件(QCoreApplicaton::instance)。
事件派发:(QCoreApplication::notify)