- 主题:Qt为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数
脑波离现实使用还十万八千里。
操作机器人,可以用手柄和语音,这两个非常成熟。
【 在 z16166 的大作中提到: 】
: 以后都是语音、脑波吧
: 不过如果语音、脑波输入通道坏了的话,还是要有fallback的输入通道的
: 输出则一定是GUI
: ...................
--
FROM 27.152.53.*
然而。。Qt 也是支持的。
Qt 的 signal/slot 是上层的包装。底层实际上也是事件机制。不信你阅读一下 QWidget 的:
paintEvent()
mouseEvent()
keyPressEvent()
timeEvent()
这些对应的就是你说的事件处理函数。
如果是子控件,也可以这样写:
private slots:
void on_button1_clicked();
on_ + 控件名 + 事件名
不用手动 connect().
Qt 提供了更多样的选择。signal/slot 其实是设计模式中观察者(事件订阅)模式的具体实现,可解耦,链式处理。比 delphi 简单的事件处理函数高级多了。
delphi
【 在 ooolinux 的大作中提到: 】
: Qt足够强大,类库也堪称好用,但是它为人称道的信号槽连接机制,比起Delphi的事件和事件处理函数就差了几条街了。
: VCL类库中事件就是一个函数指针,自然优美,这得益于Object Pascal语言的特性以及VCL的架构。
: 比如Button1的OnClick事件,被指定了Button1Click事件处理函数之后,当鼠标点击Button1时,经过Windows内核和VCL架构的消息处理与传递,最终调用了Button1Click函数,看起来就是这么简单。
: ...................
--
修改:hgoldfish FROM 27.152.53.*
FROM 27.152.53.*
也就是回调函数不支持跨线程,事件支持是么?
【 在 hgoldfish 的大作中提到: 】
: 然而。。Qt 也是支持的。
: Qt 的 signal/slot 是上层的包装。底层实际上也是事件机制。不信你阅读一下 QWidget 的:
: paintEvent()
: ...................
--
FROM 183.255.219.*
对啊。signal/slot 支持跨线程,现在还支持跨 c++ 和 js(qml). 这是个高级货。
【 在 chaobill 的大作中提到: 】
: 也就是回调函数不支持跨线程,事件支持是么?
--
FROM 27.152.53.*
那些底层的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.*
本质是标准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.*