- 主题:Qt为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数
直接调用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.*
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.*
以后都是语音、脑波吧
不过如果语音、脑波输入通道坏了的话,还是要有fallback的输入通道的
输出则一定是GUI
【 在 damingge 的大作中提到: 】
: 没有图形界面怎么遥控机器人?
:
--
修改:z16166 FROM 123.115.128.*
FROM 123.115.128.*
那些底层的keyPressEvent()之类的是QWidget的虚成员,而且是protected的,只能继承并重载,外人没法直接调用,由框架内部调用。或者QCoreApplication::postEvent()投递假消息。
Protected Functions
virtual void actionEvent(QActionEvent *event)
virtual void changeEvent(QEvent *event)
virtual void closeEvent(QCloseEvent *event)
virtual void contextMenuEvent(QContextMenuEvent *event)
void create(WId window = 0, bool initializeWindow = true, bool destroyOldWindow = true)
void destroy(bool destroyWindow = true, bool destroySubWindows = true)
virtual void dragEnterEvent(QDragEnterEvent *event)
virtual void dragLeaveEvent(QDragLeaveEvent *event)
virtual void dragMoveEvent(QDragMoveEvent *event)
virtual void dropEvent(QDropEvent *event)
virtual void enterEvent(QEnterEvent *event)
virtual void focusInEvent(QFocusEvent *event)
bool focusNextChild()
virtual bool focusNextPrevChild(bool next)
virtual void focusOutEvent(QFocusEvent *event)
bool focusPreviousChild()
virtual void hideEvent(QHideEvent *event)
virtual void inputMethodEvent(QInputMethodEvent *event)
virtual void keyPressEvent(QKeyEvent *event)
virtual void keyReleaseEvent(QKeyEvent *event)
virtual void leaveEvent(QEvent *event)
virtual void mouseDoubleClickEvent(QMouseEvent *event)
virtual void mouseMoveEvent(QMouseEvent *event)
virtual void mousePressEvent(QMouseEvent *event)
virtual void mouseReleaseEvent(QMouseEvent *event)
virtual void moveEvent(QMoveEvent *event)
virtual bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result)
virtual void paintEvent(QPaintEvent *event)
virtual void resizeEvent(QResizeEvent *event)
virtual void showEvent(QShowEvent *event)
virtual void tabletEvent(QTabletEvent *event)
virtual void wheelEvent(QWheelEvent *event)
【 在 chaobill 的大作中提到: 】
: 也就是回调函数不支持跨线程,事件支持是么?
--
FROM 123.115.128.*
就是几百行、顶多几千行的一个py文件
qt运行库、python解释器,可以共享安装,多个app共享一份。
如果和py文件打包在一起,我也不在乎这个尺寸的,哈哈
如果我在乎尺寸,以前我可能会用WTL甚至自己干掉CRT直接用API,现在还可以用Rust的native-windows-gui。
还需要跨平台的话,Tauri就行。
对我来说,Delphi/BCB再好(以前深入用过BCB),也不值得再学习使用,让它随风而去吧,人生苦短。不管是商业公司的问题,还是这两个工具本身的问题,无需再细究。
【 在 ooolinux 的大作中提到: 】
: 用PySide写的小工具体积多大?
--
修改:z16166 FROM 123.115.128.*
FROM 123.115.128.*
你推荐得很好,但是我不会去用,哈哈
你不知道以前Borland如日中天的时候,很多人都有Borland情怀
【 在 ooolinux 的大作中提到: 】
: Delphi有开源免费的替代品Lazarus
--
修改:z16166 FROM 123.115.128.*
FROM 123.115.128.*
但那是过去式了
而且我越来越觉得你象AI bot了,哈哈
【 在 ooolinux 的大作中提到: 】
: Borland的产品深得人心
--
FROM 123.115.128.*
bot专用贴图又来了
【 在 ooolinux 的大作中提到: 】
: 你都用一用就知道了
: [upload=1][/upload]
--
FROM 123.115.128.*
他是没有喜怒哀乐的Delphi/BCB吹。别人再喷,我也从没看到他有丝毫的情绪波动,哈哈
所有的帖子都没有语气、情绪,这有点老式的bot的特征。现在的AI bot是可以预设角色和行为风格的。
【 在 HerSMTH 的大作中提到: 】
: 那你还莫名惊诧个啥?
:
--
修改:z16166 FROM 123.115.128.*
FROM 123.115.128.*
只要是个人都会有喜怒哀乐的,会有情绪的。尤其是长期灌水的。
你说的反而违反常识。也许楼主是个极端的例外
【 在 hgoldfish 的大作中提到: 】
: 别这么说啊。
: 灌个水还要灌出喜怒哀乐出来。
: 这是水灌得少了。
: ...................
--
修改:z16166 FROM 123.115.128.*
FROM 123.115.128.*