【问题标题】:Pointer to a Qt Slot指向 Qt 插槽的指针
【发布时间】:2009-10-27 09:00:05
【问题描述】:

我想建立一个指向 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 无符号整数)'

提示:插槽在 DriverBoard 类中

知道我的错误在哪里吗?

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

谢谢! 西蒙

【问题讨论】:

    标签: c++ qt pointers signals-slots


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!这样就容易多了。
    【解决方案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 &))); 
      // ...
    

    【讨论】:

    • 最好将信号/插槽名称传递为const char *。不需要转换为 QString。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多