- 主题:Qt为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数
Qt足够强大,类库也堪称好用,但是它为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数就差了几条街了。
VCL类库中事件就是一个函数指针,自然优美,这得益于Object Pascal语言的特性以及VCL的架构。
比如Button1的OnClick事件,被指定了Button1Click事件处理函数之后,当鼠标点击Button1时,经过Windows内核和VCL架构的消息处理与传递,最终调用了Button1Click函数,看起来就是这么简单。
--
修改:ooolinux FROM 112.50.55.*
FROM 112.50.55.*
让AI回复你:
言论中提到Qt的信号槽“比起Delphi的事件就差了几条街”,这个评价更多是基于语言集成度的主观感受:
对Delphi/VCL的欣赏角度:在Delphi中,事件就是一个简单的函数指针。当你双击按钮时,IDE自动生成一个事件处理函数的框架,看起来就是直接和自然。从“语法噪音”的角度看,它确实非常干净。
对Qt的误解角度:Qt的信号槽虽然功能更强大,但早期的语法确实比较繁琐(使用SIGNAL和SLOT宏,需要编译器的元对象系统支持)。这会让习惯Delphi简洁风格的人觉得不够直接。
总的来说,VCL的事件设计简洁、与语言(Object Pascal)集成得天衣无缝,是1对1回调的优雅实现。而Qt的信号槽设计更宏大,牺牲了一点语法上的简洁(在新版Qt5/6中已大幅改善),换来了1对多、线程安全和高度解耦的强大能力。
这两种选择体现了两种不同的设计哲学:极致的简洁与语言集成,还是极致的功能与组件解耦。对于今天的大型复杂应用来说,Qt的信号槽机制通常被认为是更现代化的选择。
【 在 ooolinux 的大作中提到: 】
: Qt足够强大,类库也堪称好用,但是它为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数就差了几条街了。
: VCL类库中事件就是一个函数指针,自然优美,这得益于Object Pascal语言的特性以及VCL的架构。
: 比如Button1的OnClick事件,被指定了Button1Click事件处理函数之后,当鼠标点击Button1时,经过Windows内核和VCL架构的消息处理与传递,最终调用了Button1Click函数,看起来就是这么简单。
: ...................
--
FROM 117.43.75.*
直接调用callback的指针,速度快,但耦合性太高,不在UI线程里时操作UI控件要码农自己做同步,忘了做同步就是bug。属于最直接最原始的事件分发的抽象,只有在效率高于一切时才需要考虑用这种。
Qt的signal/slot会自动区分UI线程、非UI线程,解耦当然是没问题的。支持一对多。
Delphi的设计者跑到微软后搞的C#,里面的多播委托也支持一对多。
但是C# WinForms里也是要码农手动区分UI线程、非UI线程的,可以封个无脑函数让调用者无需区分。
C# WPF里对区分UI线程、非UI线程又是另一套搞法。
Objective-C的消息分发和Qt的signal/slot有点类似,但并不完全相同。
我之前发过帖子说了个暴论“现在AI写桌面小工具,PySide是王道”,哈哈。
因为PySide调用的就是Qt,既可以利用Qt的signal/slot和大量的积木widget,也可以利用python的简洁、丰富的库,以及AI对python的语料积累。
我自己用PySide已经写了好几个小工具了,不需要发布出去的,或者不担心被人逆向分析啥的,也不用编译成byte code。
【 在 ooolinux 的大作中提到: 】
: Qt足够强大,类库也堪称好用,但是它为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数就差了几条街了。
: VCL类库中事件就是一个函数指针,自然优美,这得益于Object Pascal语言的特性以及VCL的架构。
: 比如Button1的OnClick事件,被指定了Button1Click事件处理函数之后,当鼠标点击Button1时,经过Windows内核和VCL架构的消息处理与传递,最终调用了Button1Click函数,看起来就是这么简单。
: ...................
--
修改:z16166 FROM 123.115.128.*
FROM 123.115.128.*
什么乱七八糟的?
WinMain里面的消息循环还不够牛币的?
【 在 ooolinux 的大作中提到: 】
: Qt足够强大,类库也堪称好用,但是它为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数就差了几条街了。
: VCL类库中事件就是一个函数指针,自然优美,这得益于Object Pascal语言的特性以及VCL的架构。
: 比如Button1的OnClick事件,被指定了Button1Click事件处理函数之后,当鼠标点击Button1时,经过Windows内核和VCL架构的消息处理与传递,最终调用了Button1Click函数,看起来就是这么简单。
: ...................
--
FROM 140.99.83.*
都可以扔进垃圾堆了 未来面向ai编程不需要图形界面
【 在 ooolinux 的大作中提到: 】
: Qt足够强大,类库也堪称好用,但是它为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数就差了几条街了。
: VCL类库中事件就是一个函数指针,自然优美,这得益于Object Pascal语言的特性以及VCL的架构。
: 比如Button1的OnClick事件,被指定了Button1Click事件处理函数之后,当鼠标点击Button1时,经过Windows内核和VCL架构的消息处理与传递,最终调用了Button1Click函数,看起来就是这么简单。
: --
:
: FROM 112.50.55.* [福建–三明 移动]
--发自 ismth(丝滑版)
--
FROM 60.27.225.*
马克!!!
【 在 ooolinux 的大作中提到: 】
Qt足够强大,类库也堪称好用,但是它为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数就差了几条街了。
VCL类库中事件就是一个函数指针,自然优美,这得益于Object Pascal语言的特性以及VCL的架构。
比如Button1的OnClick事件,被指定了Button1Click事件处理函数之后,当鼠标点击Button1时,经过Windows内核和VCL架构的消息处理与传递,最终调用了Button1Click函数,看起来就是这么简单。
--
修改:ooolinux FROM 112.50.55.*
FROM 175.0.136.*
最近在看信号传递,这个的原理是什么?用一个map维护callback函数吗?
--
FROM 39.144.106.*
AI会给你讲得很清楚。
MOC编译时针对每个 signal 有一个连接链表(vector / linked list),
所以结构更接近:
sender
├── signal 0 -> [conn1, conn2, conn3]
├── signal 1 -> [conn4, conn5]
Delphi 的事件本质是:就是一个函数指针 + this 指针。所以:
一对一
编译期绑定
不支持自动跨线程
不支持反射
而 Qt:
一对多
运行时连接
支持运行时反射
支持跨线程
支持排队
自动断连
复杂度完全不同。
【 在 tortelee 的大作中提到: 】
: 最近在看信号传递,这个的原理是什么?用一个map维护callback函数吗?
--
FROM 123.115.128.*
没有图形界面怎么遥控机器人?
【 在 windychen 的大作中提到: 】
: 都可以扔进垃圾堆了 未来面向ai编程不需要图形界面
: --发自 ismth(丝滑版)
--
FROM 180.78.130.*
以后都是语音、脑波吧
不过如果语音、脑波输入通道坏了的话,还是要有fallback的输入通道的
输出则一定是GUI
【 在 damingge 的大作中提到: 】
: 没有图形界面怎么遥控机器人?
:
--
修改:z16166 FROM 123.115.128.*
FROM 123.115.128.*