9.4 事件与信号的区别


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

9.4 事件与信号的区别


Qt 事件和信号的关系

Qt的事件是windows的底层消息封装而成的

这个消息和MFC里的消息是同一概念,都是指键盘、鼠标等的按压、松开等消息。


例如按下键盘后,windows系统会发出一个 WM_KEYDOWN的消息,Qt捕获这个消息后,将其转换成 Qt::Key_Down 事件。

好文章,来自【福优学苑@音视频+流媒体】

Qt的事件是较为底层的概念。

先有事件,然后才有信号。即:windows消息 -> 事件 -> 信号


总结:windows发出消息,Qt捕获消息后转换成事件,再由事件处理后发出信号。


一般来说,如果仅仅是使用Qt的控件,那么只需关心这个控件能发出什么信号,但如果需要深一层的定制控件,则需要关心事件,并重写事件处理函数。


好文章,来自【福优学苑@音视频+流媒体】

事件(event)是由操作系统或者Qt运行时引擎在不同的时刻发出的。

    当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。

    一些事件是在对用户操作做出响应的时候发出,如键盘事件等;另一些事件则是由系统自动发出,如计时器事件。

好文章,来自【福优学苑@音视频+流媒体】

    一般来说,使用Qt编程时,我们并不会把主要精力放在事件上,因为在Qt中,需要我们关心的事件总会发出一个信号。

    比如,我们关心的是QPushButton的鼠标点击,但我们不需要关心这个鼠标点击事件,而是关心它的clicked()信号。


Qt的事件很容易和信号槽混淆。

这里简单的说明一下

signal由具体对象发出,然后会马上交给由connect函数连接的slot进行处理;

而对于事件,Qt使用一个事件队列对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部,前一个事件完成后,取出后面的事件进行处理。

但是,必要的时候,Qt的事件也是可以不进入事件队列,而是直接处理的。并且,事件还可以使用“事件过滤器”进行过滤。

好文章,来自【福优学苑@音视频+流媒体】

Qt的事件循环

还记得我们在main函数里面创建了一个QApplication对象,然后调用了它的exec()函数吗?

其实,这个函数就是开始Qt的事件循环


好文章,来自【福优学苑@音视频+流媒体】

在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。

当事件发生时,Qt将创建一个事件对象QEvent。

Qt的所有事件都继承于QEvent类。


在事件对象创建完毕后,Qt将这个事件对象传递给QObject的event()函数

event()函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函数(event handler)。

好文章,来自【福优学苑@音视频+流媒体】


在所有组件的父类QWidget中,定义了很多事件处理函数,如keyPressEvent()、keyReleaseEvent()、mouseDoubleClickEvent()、mouseMoveEvent ()、mousePressEvent()、mouseReleaseEvent()等。

这些函数都是protected virtual的,也就是说,我们应该在子类中重定义这些函数。

好文章,来自【福优学苑@音视频+流媒体】

好文章,来自【福优学苑@音视频+流媒体】

这里我们继承了QLabel类,

重写了mousePressEvent、mouseMoveEvent和MouseReleaseEvent三个函数。

我们并没有添加什么功能,只是在鼠标按下(press)、鼠标移动(move)和鼠标释放(release)时把坐标显示在这个Label上面。

image.png

注意我们在mouseReleaseEvent函数里面有关QString的构造。

好文章,来自【福优学苑@音视频+流媒体】

我们使用C语言风格的sprintf来构造QString对象,如果你对C语法很熟悉(估计很多C+++程序员都会比较熟悉的吧),那么就可以在Qt中试试熟悉的C格式化写法啦!


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***