首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >信号/槽概念Qt和模板...替代方案?

信号/槽概念Qt和模板...替代方案?
EN

Stack Overflow用户
提问于 2015-03-24 20:04:21
回答 2查看 1.8K关注 0票数 4

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-03-25 04:01:33

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

您可以将模板类与qt信号槽一起使用,但与next restircions一起使用:

必须从QObject

  • Q_OBJECT宏继承
  1. 模板类不能在模板类中使用
  2. 您不能在此类中定义信号和插槽-所有信号和插槽都必须在父类中。

您可以在header for QFutureWatcher class中看到的实现示例。

对于Qt的内部信号/槽概念,有没有合理的替代方案?

如果您只需要对Qt::DirectConnection使用模拟,那么来自here的任何实现都是合适的。如果你还需要Qt::QueuedConnection,我不知道没有额外代码使用的直接类比。例如,Qt::QueuedConnection可以通过boost::signals和boost::asio对象实现。

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

我理解你的问题,如果不支持可变模板,则需要对boost信号进行预处理。来自boost signal.hpp file

代码语言:javascript
复制
#ifdef BOOST_NO_VARIADIC_TEMPLATES
#include <boost/signals2/preprocessed_signal.hpp>
#else
#include <boost/signals2/variadic_signal.hpp>
#endif
票数 2
EN

Stack Overflow用户

发布于 2015-03-24 20:36:56

看看sigslot吧。它非常类似于Qt信号/插槽语法,并且是纯C++:

代码语言:javascript
复制
class Switch
{
public:
    signal0<> Clicked;
};

class Light : public has_slots<>
{
public:
    void ToggleState();
};

Switch sw;
Light light;

sw.Clicked.connect(&light, &Light::ToggleState);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29232212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档