在Qt中创建动态广告位

| 我正在尝试动态创建插槽并连接它们。我能够动态创建按钮并将它们与现有插槽连接。但是,如果我有一个带有某些成员函数的类,并且想将这些函数用作插槽该怎么办。 从一般的角度来看,我想创建一个模板,用于在给定函数指针的情况下生成插槽。这使我们可以创建插槽而无需更改现有代码,也不必使用MOC重新编译。 如果这没有意义,请告诉我。谢谢。 -简历     
已邀请:
这确实很有意义。我假设
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;
};
为要封装的每个函数创建一个,然后照常连接到ѭ2。 现在,如果他们确实有争论,也许这篇Qt Quarterly文章可能会有所帮助。 Eskil A. Blomfeldt撰写的动态信号和插槽 该技术涉及您自己重新实现
qt_metacall
方法。该方法具有以下签名:
int QObject::qt_metacall(QMetaObject::Call call, int id, void **arguments)
调用是元调用的一种:插槽,信号,属性读取或写入等。每个插槽都有一个ID。参数打包在参数数组中(按值或作为指针)。读取moc生成的代码是了解其全部工作方式的好方法。 关于原始函数签名的数据仅在编译期间可用,但是插槽在运行时解析。由于这种不匹配,您将需要将函数包装到模板适配器类型中,该适配器类型为type3ѭ的实现提供一个恒定的接口,并将
arguments
数组转换为函数可以理解的内容(参见Python unpack运算符)。 Boost.Signals进行这种模板黑客。     
Andref代码的延续,以便使用任何成员函数作为插槽
    class SlotForwarder : public QObject
    {
        Q_OBJECT

    public:

        typedef void (*Function)();

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

    public slots:

        void forward()
        {
            m_fptr();
        }

    private:

        Function m_fptr;
    };

    int main(){
      QApplication a(argc, argv);
      MyClass myClassObject; //contains a function called MemberFunc
      //create a slotforwarder object so 
      SlotForwarder *memberFuncSlot = new SlotForwarder (std::tr1::bind(&MyClass::MemberFunc, &myClassObject));
      QObject::connect(ui.button,SIGNAL(clicked()),memberFuncSlot,SLOT(forward());
    }
    

要回复问题请先登录注册