- 主题:Qt为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数
Qt足够强大,类库也堪称好用,但是它为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数就差了几条街了。
VCL类库中事件就是一个函数指针,自然优美,这得益于Object Pascal语言的特性以及VCL的架构。
比如Button1的OnClick事件,被指定了Button1Click事件处理函数之后,当鼠标点击Button1时,经过Windows内核和VCL架构的消息处理与传递,最终调用了Button1Click函数,看起来就是这么简单。
--
修改:ooolinux FROM 112.50.55.*
FROM 112.50.55.*
本质是标准C++不支持VCL(Object Pascal)的这种做法,Qt才搞了信号槽
【 在 adamhj 的大作中提到: 】
: 让AI回复你:
: 言论中提到Qt的信号槽“比起Delphi的事件就差了几条街”,这个评价更多是基于语言集成度的主观感受:
: 对Delphi/VCL的欣赏角度:在Delphi中,事件就是一个简单的函数指针。当你双击按钮时,IDE自动生成一个事件处理函数的框架,看起来就是直接和自然。从“语法噪音”的角度看,它确实非常干净。
: ...................
--
修改:ooolinux FROM 112.50.55.*
FROM 112.50.55.*
用PySide写的小工具体积多大?
【 在 z16166 的大作中提到: 】
: 直接调用callback的指针,速度快,但耦合性太高,不在UI线程里时操作UI控件要码农自己做同步,忘了做同步就是bug。属于最直接最原始的事件分发的抽象,只有在效率高于一切时才需要考虑用这种。
: Qt的signal/slot会自动区分UI线程、非UI线程,解耦当然是没问题的。支持一对多。
: Delphi的设计者跑到微软后搞的C#,里面的多播委托也支持一对多。
: ...................
--
FROM 112.50.55.*
原始的WinMain的消息循环处理就是一个大的switch case,杂乱无章,
而Delphi中是一条消息对应一个事件对应一个事件处理函数,只需要编写一个一个的事件处理函数就可以了
【 在 HerSMTH 的大作中提到: 】
: 什么乱七八糟的?
: WinMain里面的消息循环还不够牛币的?
:
--
修改:ooolinux FROM 112.50.55.*
FROM 112.50.55.*
没有图形界面软件给谁操作?
【 在 windychen 的大作中提到: 】
: 都可以扔进垃圾堆了 未来面向ai编程不需要图形界面
:
--
FROM 112.50.55.*
如果是说VCL,有一本《Inside深入核心:VCL架构剖析》
【 在 tortelee 的大作中提到: 】
: 最近在看信号传递,这个的原理是什么?用一个map维护callback函数吗?
--
FROM 112.50.55.*
不用手动 connect()的,其实是编译器帮你connect
【 在 hgoldfish 的大作中提到: 】
: 然而。。Qt 也是支持的。
: Qt 的 signal/slot 是上层的包装。底层实际上也是事件机制。不信你阅读一下 QWidget 的:
: paintEvent()
: ...................
--
FROM 112.50.55.*
Delphi中就是把事件比如 Button1.OnClick:=nil; 赋值为空指针
【 在 tgfbeta 的大作中提到: 】
: 那你想disconnect咋办呢?
--
FROM 112.50.55.*
那不是退步了
【 在 windychen 的大作中提到: 】
: cli啊 你不知道早期计算机都是命令行界面的吧
:
--
FROM 112.50.55.*
Delphi有开源免费的兼容替代品Lazarus,还跨平台
【 在 z16166 的大作中提到: 】
: 就是几百行、顶多几千行的一个py文件
: qt运行库、python解释器,可以共享安装,多个app共享一份。
: 如果和py文件打包在一起,我也不在乎这个尺寸的,哈哈
: ...................
--
修改:ooolinux FROM 112.50.55.*
FROM 112.50.55.*