指向Qt插槽的指针

时间:2009-10-27 09:00:05

标签: c++ qt pointers signals-slots

我想构建一个指向Qt Slot的指针:

union {
    void (*set_slot)(unsigned long value);
    void (*refresh_slot)(void);
} the_slot;

插槽定义是:

void set_pwm(unsigned long new_pwm);

我尝试做这样的事情:

the_slot.set_slot = set_pwm;

但是编译器说签名不匹配:

  

错误:类型void (DriverBoard::)(long unsigned int)' does not match的参数void(*)(long   unsigned int)'

提示:插槽位于DriverBoard类

知道我的错误在哪里?

如果有人知道 - 是否可以用信号做同样的事情?

谢谢! 西蒙

2 个答案:

答案 0 :(得分:6)

插槽和信号由其名称标识(当您在代码中使用SLOT(set_pwm(unsigned long))时,您正在构建一个字符串)。您只需存储名称和对象,然后使用QMetaObject调用插槽。

可以在C ++中使用指向成员函数的指针(参见C++ faq),但在这种情况下,我建议使用Qt的元对象系统。

答案 1 :(得分:2)

继LukášLalinský的回答之后,'传递'信号和插槽可以像这样简单:

  void Foo::bar(const QObject *sender, const QString &signal, 
    const QObject *receiver, const QString &slot)
  {
    // ...
    connect(sender, signal, receiver, slot);
    // ...
  }

  // ...
  fooObject->bar(aSender, SIGNAL(aSenderSignal(const QString &)), 
    aReceiver, SLOT(aReceiverSlot(const QString &))); 
  // ...