信号/插槽概念Qt和模板..备选方案

Signal/Slot concept Qt and templates... Alternatives?

本文关键字:方案 Qt 插槽 信号      更新时间:2023-10-16

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

Qt的内部Singal/Slot概念有合理的替代方案吗?我读过关于boost::signals2的文章,但不知道它是否经过了预处理。

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

您可以将模板类与qt信号槽一起使用,但需要进行下一次恢复:

  1. 模板类必须来自QObject
  2. Q_OBJECT宏不能在模板类中使用
  3. 不能在此类中定义信号和插槽-所有信号和插槽都必须在父类中

您可以在QFutureWatcher类的头中看到实现示例。

Qt的内部Singal/Slot概念有合理的替代方案吗?

如果您只需要对Qt::DirectConnection使用模拟,例如,这里的任何实现都是合适的。如果你也需要Qt::QueuedConnection,我不知道没有额外代码的直接模拟。例如,Qt::QueuedConnection可以通过boost::信号和boost::asio对象来实现。

我读过关于boost::signals2的文章,但不知道它是否经过了预处理。

正如我理解你的问题,升压信号的预处理需要,如果不支持可变模板。来自升压信号.hpp文件:

#ifdef BOOST_NO_VARIADIC_TEMPLATES
#include <boost/signals2/preprocessed_signal.hpp>
#else
#include <boost/signals2/variadic_signal.hpp>
#endif

看看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);