相比gtk中的回调,或者mfc的对等功能,有什么技术上的优势吗?
如果有的话,体现在哪些地方?
本人小白,就感觉用起来好像更方便一些,愿大家多多指教
相比gtk中的回调,或者mfc的对等功能,有什么技术上的优势吗?
如果有的话,体现在哪些地方?
本人小白,就感觉用起来好像更方便一些,愿大家多多指教
就说回调吧,有时候经常会发现会有情况是要一直回调,回调,回调。我印象中写js的会对这个有一点点感触。
Qt的信号可以和槽连在一起,也可以用信号连接信号。信号和槽的机制让代码在可读性和简洁程度上都要好一点点。
另外有没有用过网络相关的模块呢,在异步上,信号和槽基本上让程序猿更容易写代码一些。
但是所有的东西都是两面的。这个世界没有完美的技术,只有最合适的技术
信号和槽在给你便利的同时,会打乱程序结构。在调试的时候,有时会麻烦一些。经常因为找不到是哪里发了信号导致了槽的触发,程序逻辑不对,这个也是比较蛋疼的
同时用过gtk,mfc,qt的大牛非常少吧.我仅仅用过qt.
qt的信号槽机制是利用QObject的消息循环实现的?最大的好处是不用管进程同步.qt5可以用lambda函数作为槽函数也是非常爽.
至于楼上说的找不到发射信号可以在槽函数中调用sender()函数找到发射信号的QObject.
不好的地方我认为是效率不高,因为QObject的消息循环是单线程的,但是可以依靠moveToThread或者多线程解决.
所有的东西都是两面的。这个世界没有完美的技术,只有最合适的技术。
相比回调函数来讲,信号槽的优点很多,比如可以在接收者销毁的情况下自动保证程序不崩溃;但其缺点就是不是标准C++,需要moc元对象编译器。
这里有一个开源软件,很类似Qt信号槽,并且不需要moc。
gitee.com/giveda
信号和槽分开说一下吧。
槽本质上是回调,这没啥好说的。槽是个带slot
关键字的实例方法,比起其他框架的函数指针来,优势是可以带上下文(可以理解为控件引用),并且不用显式传来传去(比如 FLTK 回调参数上有个void*
),这意味着你可以把所有必要的东西放在示例字段里面。但是比起 C++ 的std::function
还是灵活性不足。
信号本质是槽的容器,信号连接槽就相当于回调添加到容器。与std::vector
相比,信号的优势是支持多播,反之vector
就不支持operator ()
,即使里面所有元素支持这个操作。
另外 C# 提供了另一个思路,它的回调是delegate
(或者event
),但是它们天然就是自身的容器。简单来说就是一个回调可以+=
另一个回调生成新的回调,新的回调的效果是原有的两个回调的依次调用。
1 回答701 阅读✓ 已解决
622 阅读
578 阅读
573 阅读
529 阅读
1 回答321 阅读
感觉最大好处线程同步