概述
Qt中event事件分发器
运行程序时会根据实际的操作触发不同的多个事件,例如按下鼠标事件,直观讲好像是点击鼠标后,直接会调用mousePressEvent
来处理事件,其实不然,在程序与各事件处理函数之间,还有一个专门用来管理事件的部分,称为事件分发bool event(QEvent *ev)
。因此,实际事件处理流程是:用户点击鼠标,程序接收到该动作,将其交付给事件分发,事件分发对事件进行判断,然后传递给对应的事件处理函数,完成事件的处理。
事件分发的返回值为bool
类型,如果返回值为true
,则表示用户将自己处理该事件,不再向下分发事件,即不再需要对应的事件处理函数来处理。
下面为了验证存在事件分发器,编写代码使用事件分发拦截点击鼠标的事件。
void MyLabel::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
qDebug() << "22222";
}
}
void MyLabel::mouseReleaseEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
qDebug() << "66666";
}
}
void MyLabel::mouseMoveEvent(QMouseEvent *ev)
{
if(ev->buttons() == Qt::LeftButton)
{
qDebug() << "11111";
}
}
bool MyLabel::event(QEvent *ev)
{
if(ev->type() == QEvent::MouseButtonPress)
{
qDebug() << "点击鼠标拦截";
return true; // 返回true表示用户自己处理,不向下分发
}
// 其他事件交给父类进行处理
return QLabel::event(ev);
}
上述代码运行时,"66666"
和"11111"
可以正常打印,而由于进行了事件拦截,"22222"
将会被"点击鼠标拦截"
代替。
注意:上述例子只是为了验证事件处理的过程及事件分发的存在,而不是为了练习如何进行信号拦截,所以不建议在该层对事件进行处理。
最后
以上就是酷炫奇迹为你收集整理的Qt中event事件分发器的全部内容,希望文章能够帮你解决Qt中event事件分发器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复