我知道它们在概念上是如何工作的,但是 Qt 框架中的信号和插槽是如何实现的呢?Qt Creator 将它们视为关键字,但它们只是一组宏,还是在编译这些源文件之前需要特殊的预处理器?
换句话说,如果我在我的代码中使用 Qt 的信号/槽功能,我可以在任何 C++ 编译器上轻松编译它吗?
我知道它们在概念上是如何工作的,但是 Qt 框架中的信号和插槽是如何实现的呢?Qt Creator 将它们视为关键字,但它们只是一组宏,还是在编译这些源文件之前需要特殊的预处理器?
换句话说,如果我在我的代码中使用 Qt 的信号/槽功能,我可以在任何 C++ 编译器上轻松编译它吗?
Qt 的许多特性,包括信号,都需要使用 Qt 元对象编译器 (MOC)对源代码进行预处理。
如果您使用 Qt 的信号功能,您可以在 Qt 支持的任何编译器和平台上编译您的源代码。如果您需要在 Qt 不支持的平台上进行编译,您可能会运气不佳,或者至少需要进行很多有趣的集成工作(当然,任何库或框架都是如此)。
如果您正在寻找跨平台信号实现,您也可以考虑Boost.Signals。
是的,Qt 中的信号和槽是作为宏实现的。然而,MOC(元对象编译器)用于解释它。MOC 是 Qt 的一部分。
如果您想在非 Qt 项目中使用信号/插槽,您可以使用 Boost 实现(http://www.boost.org/doc/libs/1_39_0/doc/html/signals.html)。
其他实现列在 wiki 页面上:http ://en.wikipedia.org/wiki/Signals_and_slots
您可以使用 Qt 支持的任何编译器。哪些是最常用的,不知道有没有不支持的普遍编译器。但是,信号/插槽/moc 并不是这里的限制因素。信号/插槽要求在声明 QObjects 的头文件上调用 moc 可执行文件,并编译和链接生成的代码。因此,将 moc 调用集成到您现有的构建系统中可能是最大的问题。如果您从头开始,我建议您使用 qmake 或 cmake。