QT中事件处理函数的触发流程
1.基本概念
在QT中想要实现对特定的控件(如按钮,标签)的特定动作(如点击,拖动)做出指定的响应过程可以称之为事件的触发。在这个过程中有四个概念要首先了解,分别是事件对象,事件过滤器,事件函数,事件处理函数。
1.1什么是事件对象
在QT中你对界面中控件做出任意动作(点击,按键输入)都会被捕获,并转化为一个事件对象QEvent,目的就是为了能够通过程序对所有的动作进行统一的识别和管理。
1.2什么是事件过滤器
QT中有许许多多不同种类的控件类型,每一种控件又包含了各种各样的事件类型,为了能够统一的进行管理,在必要时屏蔽或修改特定控件的特定事件就产生了事件过滤器的概念。
1.3什么是事件函数
事件函数的功能与事件过滤器类似,也是为了管理事件的触发,但是他的作用仅限在针对事件对象内。
1.4什么是事件处理函数
事件处理函数指的是在特定的事件被触发后,包含所需要执行的具体事件内容的函数。
2.具体过程
主程序运行后,会一直停留在 return app.exec(),持续监听等待事件对象的输入,在事件对象输入后首先会经过事件过滤器,事件过滤器确认该事件对象的具体事件可以运行后,才可以交给特定子控件。[注]:事件过滤器需要进行特定的安装,且事件过滤器管理的是安装控件中的子控件和安装的控件本身(主控件)。
子控件接收到事件对象后会交给自己的事件函数,再由事件函数决定是否需要执行特定的事件处理函数。
3.实现原理
3.1事件过滤器函数
ui(new Ui::MainWidget)//过滤器的安装
{
ui->setupUi(this);
ui->label_2->installEventFilter(this);//安装自组件label_2的事件过滤器
}
bool MainWidget::eventFilter(QObject *Obj, QEvent *event)//obj表示传入的事件对象所属的具体子控件,event指的是该控件发生的事件对象
{
if(Obj==ui->label_2)//过滤的指定控件
{
if(event->type()==QEvent::MouseMove)//过滤指定控件的指定事件对象类型
{
QMouseEvent * env=static_cast<QMouseEvent *>(event);
ui->label_2->setText(QString("Mouse Move:(%1,%2)").arg(env->x()).arg(env->y()));//在label2中出现鼠标移动事件将鼠标坐标显示
return true;//执行以上代码后不会将事件对象传递给label2
}
}
else
{
return QWidget::eventFilter(watched,event);//不过滤其它类型事件,继续按照原来的执行方式执行(传递给基类的事件过滤器,按默认操作传递给子控件)
}
}
3.2子控件的事件函数
bool MyWidget::event(QEvent *e)
{
//事件分发
if(e->type()==QEvent::MouseMove)
{
return true;//停止触发事件处理函数
} else
{
return QWidget::event(e);//传递给基类的事件函数,正常触发事件处理函数
}
}
{
return QWidget::event(e);//传递给基类的事件函数,正常触发事件处理函数
}
}