当前位置: 首页 > 知识库问答 >
问题:

STD::功能和信号/插槽系统

朱越
2023-03-14
template <typename T> 
class Signal
{
private:
    typedef std::function<T> Slot;

public:
    Signal();

    void connect( Slot slot );
    void emit( T data );
    void emit();

private:    
    std::vector<Slot> slots;    
};

我的测试类:

class Object
{
public:
    Object();
    void sayHello(  int i  );
};

所以,我这样使用我的类:

Signal<void(int)> signal;
signal.connect( std::bind( &Object::sayHello, player, std::placeholders::_1 ) );
signal.emit( 0 );

我在signal.cpp中得到一个警告:候选函数不可行:第一个参数没有从'void(*)(int)'到'int'的已知转换;

在此代码中:

template <typename T>
void Signal<T>::emit( T data )
{
    typename std::vector<Slot>::iterator i;
    Slot t;

    for( i = this->slots.begin(); i != this->slots.end(); i++ )
    {
        t = (*i);
        t( data );   // Here
    }
}

我该怎么解决?如果我想给我的“emit”方法一个对象或多个参数,我可以做什么?

谢了!

共有1个答案

顾承平
2023-03-14

信号类中选择三行:

template <typename T> 
    // ...
    typedef std::function<T> Slot;
    // ...
    void emit( T data );

和你的信号声明:

Signal<void(int)> signal;

答案应该很明显:void emit(T)变成void emit(void(*)(int))(像void(int)这样的函数类型在指针是函数参数时转换为指针)。

template<class Sig>
class Signal;

template<class R, class... Args>
class Signal<R(Args...)>{
  // ...
  typedef std::function<R(Args...)> Slot;
  // ...
  void emit(Args... args) const{
    // iterate over slots and call them, passing `args...`
  }
};
 类似资料:
  • 与以顺序方式执行的控制台模式应用程序不同,基于GUI的应用程序是事件驱动的。 执行函数或方法以响应用户的操作,例如单击按钮,从集合中选择项目或鼠标单击等,称为events 。 用于构建GUI界面的窗口小部件充当此类事件的来源。 每个PyQt小部件都是从QObject类派生的,旨在发出“ signal ”以响应一个或多个事件。 信号本身不会执行任何操作。 相反,它“连接”到“ slot ”。 插槽可

  • 信号和槽机制是 Qt 的核心机制之一,要掌握 Qt 编程就需要对信号和槽有所了解。信号和槽是一种高级接口,它们被应用于对象之间的通信,它们是 Qt 的核心特性,也是 Qt不同于其它同类工具包的重要地方之一。 在我们所了解的其它 GUI 工具包中,窗口小部件(widget)都有一个回调函数用于响应 它们触发的动作,这个回调函数通常是一个指向某个函数的指针。在 Qt 中用信号和槽取代 了上述机制。 1

  • 导语 在前面的内容中已经多次用到过信号和槽了,这一节我们将详细讲解信号和槽的机制和使用方式。大家可以在帮助中查看Signals& Slots关键字。 环境:Windows Xp + Qt 4.8.5+QtCreator2.8.0 目录 一、信号和槽机制 二、信号和槽的自动关联 三、信号和槽的高级应用 正文 一、信号和槽机制 信号和槽用于两个对象之间的通信,信号和槽机制是Qt的核心特征,也是Qt不同

  • 我正在编写一个程序,其中几个生产者生成一些应该由几个消费者处理的数据。由于每条数据的消耗大约需要100ms,而目标平台有很多处理器,所以在我看来,每个生产者和每个消费者都得到自己的线程似乎是很自然的。我的问题是:Qt信号/插槽是将数据块从生产者传递到消费者的好方法吗?还是建议更好的解决方案(强烈首选Qt)。 为了防患于未然,制作者每小时产生几十万个数据。

  • 在视图模板中可以通过 slot 声明一个插槽的位置,其位置的内容可以由外层组件定义。 var Panel = san.defineComponent({ template: '<div>' + ' <div on-click="toggle">title</div>' + ' <p style="{{fold | yesToBe(\'display:no

  • 问题内容: 我有一个任务栏菜单,单击该任务栏菜单将其连接到获取触发事件的插槽。现在的问题是,我想知道单击了哪个菜单项,但是我不知道如何将该信息发送到连接的功能。这是用于将操作连接到功能的代码: 我知道有些事件会返回一个值,但是Trigger()不会。那么我该如何实现呢?我必须发出自己的信号吗? 问题答案: 用一个 这是PyQt书中的一个示例: 顺便说一句,您也可以使用,但是我发现该方法更加简单明了