QT的信号槽机制好不好?如果好,好在哪里?

相比gtk中的回调,或者mfc的对等功能,有什么技术上的优势吗?
如果有的话,体现在哪些地方?
本人小白,就感觉用起来好像更方便一些,愿大家多多指教

阅读 8.6k
6 个回答
新手上路,请多包涵

感觉最大好处线程同步

就说回调吧,有时候经常会发现会有情况是要一直回调,回调,回调。我印象中写js的会对这个有一点点感触。

Qt的信号可以和槽连在一起,也可以用信号连接信号。信号和槽的机制让代码在可读性和简洁程度上都要好一点点。

另外有没有用过网络相关的模块呢,在异步上,信号和槽基本上让程序猿更容易写代码一些。

但是所有的东西都是两面的。这个世界没有完美的技术,只有最合适的技术

信号和槽在给你便利的同时,会打乱程序结构。在调试的时候,有时会麻烦一些。经常因为找不到是哪里发了信号导致了槽的触发,程序逻辑不对,这个也是比较蛋疼的

新手上路,请多包涵

同时用过gtk,mfc,qt的大牛非常少吧.我仅仅用过qt.
qt的信号槽机制是利用QObject的消息循环实现的?最大的好处是不用管进程同步.qt5可以用lambda函数作为槽函数也是非常爽.
至于楼上说的找不到发射信号可以在槽函数中调用sender()函数找到发射信号的QObject.
不好的地方我认为是效率不高,因为QObject的消息循环是单线程的,但是可以依靠moveToThread或者多线程解决.

前几天在知乎看到类似问题,有答主说是Qt最早发明了这个机制,其他语言参考了并且做了改进,你可以去知乎找一下相关话题

新手上路,请多包涵

所有的东西都是两面的。这个世界没有完美的技术,只有最合适的技术。
相比回调函数来讲,信号槽的优点很多,比如可以在接收者销毁的情况下自动保证程序不崩溃;但其缺点就是不是标准C++,需要moc元对象编译器。
这里有一个开源软件,很类似Qt信号槽,并且不需要moc。
gitee.com/giveda

信号和槽分开说一下吧。

槽本质上是回调,这没啥好说的。槽是个带slot关键字的实例方法,比起其他框架的函数指针来,优势是可以带上下文(可以理解为控件引用),并且不用显式传来传去(比如 FLTK 回调参数上有个void*),这意味着你可以把所有必要的东西放在示例字段里面。但是比起 C++ 的std::function还是灵活性不足。

信号本质是槽的容器,信号连接槽就相当于回调添加到容器。与std::vector相比,信号的优势是支持多播,反之vector就不支持operator (),即使里面所有元素支持这个操作。

另外 C# 提供了另一个思路,它的回调是delegate(或者event),但是它们天然就是自身的容器。简单来说就是一个回调可以+=另一个回调生成新的回调,新的回调的效果是原有的两个回调的依次调用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题