找回密码
 立即注册
收起左侧

《qt 快速入门》例子6-2关于事件过滤器的问题。

9
回复
9601
查看
[复制链接]
累计签到:2 天
连续签到:1 天
来源: 2014-12-24 14:45:15 显示全部楼层 |阅读模式
10Qter豆
本帖最后由 caiwei_cs 于 2014-12-25 11:18 编辑

widget.cpp
  1. // 事件过滤器
  2. bool Widget::eventFilter(QObject *obj, QEvent *event)
  3. {
  4.     // 如果是lineEdit部件上的事件
  5.     if(obj == lineEdit){
  6.         if(event->type() == QEvent::KeyPress)
  7.             qDebug() << tr("Widget的事件过滤器");
  8.     }
  9.     return QWidget::eventFilter(obj,event);
  10. }
复制代码
mylineedit.cpp
  1. // 事件
  2. bool MyLineEdit::event(QEvent *event)
  3. {
  4.     if(event->type() == QEvent::KeyPress)
  5.         qDebug() << tr("MyLineEdit的event()函数");
  6.     // 执行QLineEdit类event()函数的默认操作
  7.     //return false;
  8.     return QLineEdit::event(event);
  9. }
复制代码
把return QWidget::eventFilter(obj,event); 和return QLineEdit::event(event);  中的任意一个改为return false;那个lineedit都不会在界面显示了。
我能理解这两句话是调用基类的方法。帮助里面还有:In your reimplementation of this function, if you want to filter the event out, i.e. stop it being handled further, return true; otherwise return false.

我不明白的是,不管怎么样,怎么会影响他的显示呢?



附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

1、Qobject::event()和绘制有什么关系么? 你这里将return QLineEdit::event(event);注释的话绘制事件(QEvent:aint)就不会传给QLineEdit这个widget处理,就不会调到void QLineEdit::paintEvent(QPaintEvent *)。 2、return true 或者false和截获绘制事件有什么关系。 bool QApplicationPrivate::notify_helper(QObject *receiver, QEvent * e) 函数中写的很明显了,如果事件过滤器处理了该事件(也就是eventFilter return true ...
回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2014-12-24 14:45:16 显示全部楼层
1、Qobject::event()和绘制有什么关系么?
你这里将return QLineEdit::event(event);注释的话绘制事件(QEvent::Paint)就不会传给QLineEdit这个widget处理,就不会调到void QLineEdit::paintEvent(QPaintEvent *)。
2、return true 或者false和截获绘制事件有什么关系。
bool QApplicationPrivate::notify_helper(QObject *receiver, QEvent * e)
函数中写的很明显了,如果事件过滤器处理了该事件(也就是eventFilter return true),那么就不会把事件传给widget处理。
也就说eventFilter事件过滤器中你只要return true相当于把该对象的所有事件拦截。如果你只需要拦截某个事件只需要在对应的事件分支中return。该widget的其他事件不受影响。
你在源码中看下bool QApplicationPrivate::notify_helper(QObject *receiver, QEvent * e)
和bool QWidget::event(QEvent *event)对你理解有帮助
参与人数 1人气 +2 收起 理由
caiwei_cs + 2 对我帮助很大!

查看全部评分总评分 : 人气 +2

回复

使用道具 举报

累计签到:22 天
连续签到:1 天
2014-12-24 15:26:58 显示全部楼层
MyLineEdit::event中如果你直接return false那么该控件的绘制事件就不处理,自然就不显示了。如果只有Widget::eventFilter中return false应该是不会导致不显示的,因为LineEdit的绘制事件没有被截获,Widget::eventFilter中直接return true才会导致不显示,LineEdit绘制事件被Widget截获。
回复

使用道具 举报

累计签到:1569 天
连续签到:1 天
2014-12-24 21:25:03 显示全部楼层
应该不会消失啊!可以截个图看看。或者下载源码运行测试一下。
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2014-12-25 11:06:22 显示全部楼层
本帖最后由 caiwei_cs 于 2014-12-25 11:16 编辑
yafeilinux 发表于 2014-12-24 21:25
应该不会消失啊!可以截个图看看。或者下载源码运行测试一下。

就是这样的。看不到东西咯。就是这样的。看不到东西咯。我用的就是源码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2014-12-25 11:15:55 显示全部楼层
leo_cao 发表于 2014-12-24 15:26
MyLineEdit::event中如果你直接return false那么该控件的绘制事件就不处理,自然就不显示了。如果只有Widge ...

确实是你说的这样的。不过我还不是很明白:
1.“MyLineEdit::event中如果你直接return false那么该控件的绘制事件就不处理,自然就不显示了。”
Qobject::event()和绘制有什么关系么?

2.“如果只有Widget::eventFilter中return false应该是不会导致不显示的,因为LineEdit的绘制事件没有被截获,Widget::eventFilter中直接return true才会导致不显示,LineEdit绘制事件被Widget截获。”
return true 或者false和截获绘制事件有什么关系。

1.要事件被MyLineEdit截获并且不被Widget截获?
2.return QWidget::eventFilter(obj,event); 和return QLineEdit::event(event); 这两个函数到底代表了什么?有些糊涂了。

是我从根本就没理解透彻吧?


回复

使用道具 举报

累计签到:1569 天
连续签到:1 天
2014-12-25 22:41:13 显示全部楼层
caiwei_cs 发表于 2014-12-25 11:06
就是这样的。看不到东西咯。就是这样的。看不到东西咯。我用的就是源码。 ...



这样吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2014-12-26 22:43:07 显示全部楼层
本帖最后由 caiwei_cs 于 2014-12-26 22:46 编辑
yafeilinux 发表于 2014-12-25 22:41
这样吗?

是这样的,怎么我的不能显示?怪了。
这是我修改了语句以后不能显示的代码。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:1569 天
连续签到:1 天
2014-12-26 23:04:13 显示全部楼层
caiwei_cs 发表于 2014-12-26 22:43
是这样的,怎么我的不能显示?怪了。
这是我修改了语句以后不能显示的代码。
...

我测试了,没有问题的。 Win 7 + Qt 4.8.5 + Qt Creator 2.8.0
回复

使用道具 举报

累计签到:2 天
连续签到:1 天
2014-12-26 23:08:01 显示全部楼层
leo_cao 发表于 2014-12-25 13:00
1、Qobject::event()和绘制有什么关系么?
你这里将return QLineEdit::event(event);注释的话绘制事件(QEv ...

我看了帮助,和你的解释都明白了。
谢谢了。
想问一下,网上很多人说看原码,我怎么在qt里面看不到?
只能看到定义。是要专门下载么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了