最近学QT,对信号槽机制感到有点新鲜:

QObject::connect(slider, SIGNAL(valueChanged(int)), lcd, SLOT(display(int)));

自己总结其原理,就是一句话:把两个对象的函数相关(往往是设置同一个值),而不用考虑两个对象之间的关系,而且可以一对多发信号。缺点是,事先要规定哪些函数可以信号,哪些函数是槽。而且执行内容貌似有点单调。

这一机制号称先进,但Delphi里其实也有,而且应该更强大,因为信号槽可以任意指定(不需要专门定义),至于信号本身,控件已经把常用的信号都给你定义好了,如果还不够则需要自己继承后增加,不过也很容易。而且没有反应速度慢一个数量级一说。而且设计时就可以Connect,动态增加/改变/Deconnect也行。设计的时候,其机制被存储在.dfm文件里:

object Edit1: TEdit
Left = 136
Top = 80
Width = 121
Height = 21
TabOrder = 0
Text = 'Edit1'
OnChange = Edit1Change
OnClick = Edit1Click
end

这是可视化设计的做法。如果忘了这么做,动态写语句也可以,而且就一句话:

    Edit1.OnClick := Button2Click (以OnClick事件为例,注意它不是OnMouseDown和OnMouseUp事件,但它们之间也有一定的联系。OnClick事件实际上是由OnMouseUp函数来执行的)

缺点是,必须要事先定义FOnClick这个事件,其类型是定义在TControl里的 FOnClick: TNotifyEvent; 也就是必须事先定义槽。至于信号无所谓,只要参数一致即可(我猜测,通过复杂的语法变幻,没准参数都不必一致)。定义了槽就可以随时动态插拔要执行的函数,真是方便:

procedure TControl.Click;
begin
if Assigned(FOnClick) then
FOnClick(Self);
end;

通过调用Click这个专门检查槽和执行槽的函数,达到触发槽的目的。但是还不够,触发前后肯定要做一堆事情,并且要加上条件判断才行,看这里:

procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited; // 怪异,为什么要先执行这个?会去执行DefaultHandler。答案可以到TForm和TEdit里去寻找
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click; // 判断落点,然后才触发;否则无效
end;
DoMouseUp(Message, mbLeft);
end;

但是到底谁来触发这个槽呢(第一驱动力)?Windows下说到底是要靠消息来触发,所以就很简单啦:

procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;

QT信号槽与Delphi事件的对比的更多相关文章

  1. QT源码之Qt信号槽机制与事件机制的联系

    QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容. 本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConne ...

  2. Qt信号槽的一些事(第一次知道信号还有返回值,以及Qt::UniqueConnection)

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...

  3. QT信号槽详解

    1         QT信号槽详解 1.1  信号和槽的定义 信号是触发信号,例如按钮的点击触发一个clicked信号,槽是用来接收信号,并处理信号,相当于信号响应函数.一个信号可以关联多个槽函数,信 ...

  4. Qt信号槽的一些事 Qt::带返回值的信号发射方式

    一般来说,我们发出信号使用emit这个关键字来操作,但是会发现,emit并不算一个调用,所以它没有返回值.那么如果我们发出这个信号想获取一个返回值怎么办呢? 两个办法:1.通过出参形式返回,引用或者指 ...

  5. Qt信号槽的一些事

    注:此文是站在Qt5的角度说的,对于Qt4部分是不适用的. 1.先说Qt信号槽的几种连接方式和执行方式. 1)Qt信号槽给出了五种连接方式: Qt::AutoConnection 0 自动连接:默认的 ...

  6. Qt信号槽-原理分析

    目录 一.问题 二.Moc 1.变量 2.Q_OBJECT展开后的函数声明 3.自定义信号 三.connect 四.信号触发 1.直连 2.队列连接 五.总结 六.推荐阅读 一.问题 学习Qt有一段时 ...

  7. Qt信号槽源码剖析(二)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的基本概念.元对象编译器.示例代码以及Qt宏:今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频. Qt信号槽的宏 ...

  8. (文字版)Qt信号槽源码剖析(三)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上节视频给大家讲解了Qt信号槽的Qt宏展开推导:今天接着深入分析,进入Qt信号槽源码剖析系列的第三节视频. Qt信号槽宏推导归纳 #define si ...

  9. QT 信号槽connect中解决自定义数据类型或数组作为函数参数的问题——QT qRegisterMetaType 注册MetaType——关键:注册自定义数据类型或QMap等容器类

    一般情况下信号槽直接连接方式不会出现问题,但是如果信号与槽在不同线程或Qt::QueuedConnection方式连接,可能会在连接期间报以下类似问题,如: QObject::connect: Can ...

随机推荐

  1. 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

    package algorithms; /* 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. public class ListNode { int val; ListNo ...

  2. Ajax 调用案例及错误捕捉

    function postFunc() { var scoreResultStr = readyData(); $.ajax({ type: "post", url: " ...

  3. eBPF监控工具bcc系列一启航

    eBPF监控工具bcc系列一启航 在eBPF篇中,我们知道虽然可用 C 来实现 BPF,但编译出来的却仍然是 ELF 文件,开发者需要手动析出真正可以注入内核的代码.工作有些麻烦,于是就有人设计了 B ...

  4. 使用 resultMap 实现高级结果集映射

    resultMap 的基本配置项 属性 id 属性:resultMap 的唯一标识,此 id 值用于 select 元素 resultMap 属性的引用. type 属性:表示该 resultMap ...

  5. eclipse 中常用快捷键

    * 字母大小写转换 ctrl+shift+x   转为大写 ctrl+shift+y   转为小写 * eclipse 自动生成对象来接收方法的返回值的快捷键 说明:光标一定要定位到要自动生成返回值对 ...

  6. linux sar-系统运行状态统计工具

    推荐:更多linux 性能监测与优化 关注:linux命令大全 sar命令是Linux下系统运行状态统计工具,它将指定的操作系统状态计数器显示到标准输出设备.sar工具将对系统当前的状态进行取样,然后 ...

  7. mess系统 开发技术,需求整理

    1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源(如html 页 ...

  8. Spring security 5 Authorize Configuration

    1. Spring Security 核心请求,认证配置类 WebSecurityConfigurerAdapter protected void configure(HttpSecurity htt ...

  9. 百练2815:城堡问题(DFS)

    描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # ...

  10. Spring MVC 概述

    [简介] Spring MVC也叫Spring web mvc,属于表现层的框架.SpringMVC是Spring框架的一部分,是在Spring 3.0后发布的. 由以上Spring的结构图可以看出, ...