Qt事件系统

一、Qt中的事件

事件是对各种应用程序需要知道的由应用程序内部或外部产生的是事情或者动作的统称。
在Qt中,使用一个对象来表示一个事件,继承自QEvent类。
事件和信号的区别:
单击一个见面上一个按钮,就会产生一个鼠标事件QMouseEvent,这个事件不是按钮产生。
而信号的产生是由按钮被按下,会发出clicked()信号,这个是按钮产生。
信号与槽,只关注按钮单击信号,而不考虑鼠标事件。
信号和事件是两种不同层面的东西,发出者不同,作用也不同。
在Qt中,任何QObject子类实例都可以接收和处理事件。

二、事件的处理

一个事件有特定的QEvent的子类来表示,但是有时候一个事件又包含很多时间类型,比如鼠标事件,可以分为鼠标按下,双击,右击,滑轮滚动事件等操作。
这类事件类型都是由QEvent类的枚举型来定义,QEvent::Type来表示。
QEvent子类可以表示一个事件,但是事件的处理却不是由其来完成。
处理事件的方法:

方法1.

重新实现部件的paintEvent(),mouseEvent()等需要用到的事件方法。这是最常用的,
但是,它只能处理特定部件的特定事件。

方法2.

重新实现notify()函数。这个函数很强大,提供了完全控制,可以在时间过滤器得到事件之前就获得他们。
但是,它一次只能处理一个事件。

方法3.

向QApplication对象安装事件过滤器。因为一个程序只能由一个QApplication的对象,所以这样实现的功能和与notify()一样。
但是,它可以一次处理多个事件。

方法4.

重新实现event()函数。QObject类的event()函数可以在事件达到默认事件处理函数之前获得该事件。

方法5.

在对象上安装事件过滤器,使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。

实际编程,常用的是方法一和五。
方法二需要继承QApplication类,方法三,是要使用一个全局的事件过滤器,将减缓事件的传递。

三、事件的传递

每个main函数都会调用QApplication类的exec()函数,它会使Qt程序进入事件的循环,这样就会使程序在运行时接受发生的各种事件。
一旦事件有发生,Qt会构建一个相应的QEvent子类的对象来表示,然后将它传递给相应的QObject对象或其子类对象。

事件传递的相关博客:http://blog.csdn.net/lpmygod/article/details/39135619

下面自己实现的事件,可以看出,事件传递过程:事件过滤器->对象部件的event()函数->对象部件的事件处理函数keyPressEvent(),如果ignore那么继续传递->父部件事件处理函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值