我想构建一个指向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类
中知道我的错误在哪里?
如果有人知道 - 是否可以用信号做同样的事情?
谢谢! 西蒙
答案 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 &)));
// ...