使用Qt我越来越恼火了。 Qt不允许我在其大多数类中使用模板,因为MOC编译器(或更好的预处理器)在c ++的实际代码生成之前运行。
Qt的内部Singal / Slot概念是否有合理的替代方案?我读到了关于boost :: signals2但无法确定它是否经过预处理。
答案 0 :(得分:1)
看看sigslot。它与Qt信号/插槽语法非常相似,它是纯粹的C ++:
class Switch
{
public:
signal0<> Clicked;
};
class Light : public has_slots<>
{
public:
void ToggleState();
};
Switch sw;
Light light;
sw.Clicked.connect(&light, &Light::ToggleState);
答案 1 :(得分:1)
Qt不允许我在其大多数类中使用模板,因为MOC编译器(或更好的预处理器)在c ++的实际代码生成之前运行。
您可以将模板类与qt信号槽一起使用,但可以使用下一个结果:
您可以在header for QFutureWatcher class中看到的实施示例。
Qt的内部Singal / Slot概念是否有合理的替代方案?
如果您只需要对Qt :: DirectConnection使用模拟,那么任何实现都来自(例如)here合适的实现。如果你还需要Qt :: QueuedConnection,我不知道没有附加代码使用的直接模拟。例如,Qt :: QueuedConnection可以通过boost :: signals和boost :: asio对象实现。
我读到了关于boost :: signals2但无法确定它是否已经过预处理。
据我所知,如果不支持可变参数模板,则需要对boost信号进行预处理。来自boost signal.hpp file:
#ifdef BOOST_NO_VARIADIC_TEMPLATES
#include <boost/signals2/preprocessed_signal.hpp>
#else
#include <boost/signals2/variadic_signal.hpp>
#endif