概述
Qt事件分发及过滤
当我们的程序发现一个事件的时候,并不是立即调用事件函数,而是全部交由分发器event()处理。event()返回的数据类型是bool类型,如果event()返回的结果是true表示用户要自己处理事件,event()就不会向下分发。
所以我们可以利用event()做事件的拦截(不建议)
事件拦截
例:在myLbel部件中拦截鼠标点击事件
// 鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev){
if (ev->button() == Qt::LeftButton) {
QString str = QString("鼠标按下了,x = %1 y = %2").arg(ev->x()).arg(ev->y());
qDebug() << str;
}
}
// 重写event()
bool myLabel::event(QEvent * e) {
// 如果是鼠标按下事件,在这里拦截
if (e->type() == QEvent::MouseButtonPress) {
// 事件类型转换
QMouseEvent * ev = static_cast<QMouseEvent *>(e);
// 处理事件
QString str = QString("myLabel::event()中鼠标按下了,x = %1 y = %2").arg(ev->x()).arg(ev->y());
qDebug() << str;
// 不再向下分发
return true;
}
// 其他事件交给父类处理(默认处理)
return QLabel::event(e);
}
事件过滤器
从程序发现事件到事件分发器之间,实际上还可以有一个环节——事件过滤器。通过事件过滤器,可以在程序分发到event之前再做一次高级拦截。
使用方法:
- 给控件安装事件过滤器
- 重写eventfilter
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 添加过滤器
ui->label->installEventFilter(this);
}
// 重写过滤器
bool Widget::eventFilter(QObject * obj,QEvent * e) {
//判断控件
if (obj == ui->label) {
// 判断事件
if (e->type() == QEvent::MouseButtonPress) {
QMouseEvent * ev = static_cast<QMouseEvent *>(e);
QString str = QString("事件过滤器中鼠标按下了,x = %1 y = %2").arg(ev->x()).arg(ev->y());
qDebug() << str;
return true;
}
}
//其他事件默认处理
return QWidget::eventFilter(obj,e);
}
最后
以上就是傻傻胡萝卜为你收集整理的Qt事件分发及过滤Qt事件分发及过滤的全部内容,希望文章能够帮你解决Qt事件分发及过滤Qt事件分发及过滤所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复