信号/插槽概念Qt和模板......替代品?

时间:2015-03-24 12:04:21

标签: c++ qt signals-slots

使用Qt我越来越恼火了。 Qt不允许我在其大多数类中使用模板,因为MOC编译器(或更好的预处理器)在c ++的实际代码生成之前运行。

Qt的内部Singal / Slot概念是否有合理的替代方案?我读到了关于boost :: signals2但无法确定它是否经过预处理。

2 个答案:

答案 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信号槽一起使用,但可以使用下一个结果:

  1. 模板类必须来自QObject
  2. Q_OBJECT宏不能在模板类中使用
  3. 您无法在此类中定义信号和插槽 - 所有信号和插槽必须位于父类中。
  4. 您可以在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