2

我想建立一个指向 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 matchvoid (*)(long unsigned int)'类型的参数

提示:插槽在 DriverBoard 类中

知道我的错误在哪里吗?

如果有人知道 - 是否也可以用信号做类似的事情?

谢谢!西蒙

4

2 回答 2

6

插槽和信号由它们的名称标识(当您SLOT(set_pwm(unsigned long))在代码中使用时,您正在构造一个字符串)。您可以简单地存储名称和对象,然后使用QMetaObject.

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

于 2009-10-27T09:03:38.183 回答
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 &))); 
  // ...
于 2009-10-27T14:41:37.043 回答