在Qt中创建动态插槽

blu*_*kin 11 qt dynamic signals-slots

我正在尝试动态创建插槽并连接它们.我能够动态创建pushButtons并将它们与现有插槽连接.但是,如果我有一个具有一些成员函数的类,并且我想将这些函数用作插槽,该怎么办?

从一般的角度来看,我想创建一个模板,用于在给定函数指针的情况下生成槽.这允许我们在不改变现有代码的情况下创建插槽,而不必使用MOC重新编译.如果这没有意义,请告诉我.谢谢.

-简历

and*_*ref 11

它确实很有意义.我认为QSignalMapper不是你想要的.如果你的函数没有参数,那么这样就足够了:

class SlotForwarder : public QObject
{
    Q_OBJECT

public:

    typedef void (*Function)(); // or whatever. I never get this syntax right...

    SlotForwarder(Function function, QObject* parent = 0) 
        : QObject(parent)
        , m_fptr(function)
    {}

public slots:

    void forward()
    {
        m_fptr();
    }

private:

    Function m_fptr;
};
Run Code Online (Sandbox Code Playgroud)

为要封装的每个函数创建一个并forward像往常一样连接.


现在,如果他们确实有争论,也许这篇Qt季刊文章可能会有所帮助.

动态信号和插槽由Eskil A. Blomfeldt撰写

该技术涉及qt_metacall自己重新实现该方法.该方法具有以下签名:

int QObject::qt_metacall(QMetaObject::Call call, int id, void **arguments)
Run Code Online (Sandbox Code Playgroud)

调用是一种metacall:插槽,信号,属性读或写等.每个插槽都有一个id.参数在arguments数组中打包(按值或作为指针).阅读moc生成的代码是了解它如何工作的好方法.

有关原始函数签名的数据仅在编译期间可用,但在运行时解析插槽.由于这种不匹配,您需要将函数包装到模板适配器类型中,该类型为您的实现提供一个常量接口qt_metacall,并将arguments数组转换为函数可以理解的内容(参见Python 解包操作符).Boost.Signals做了那种模板hackery.