0

I've been trying to create a connection(QObject::connect) at run time.

I wanted to pass a pointer to a member function to another class template. It complied successfully, but link errors raised at run time.

DynamicSlotCreator.h:

template <typename OBJ, typename FUNC>
class DynamicSlotCreator : public QObject
{
    Q_OBJECT;

private:
    OBJ obj;
    FUNC func;

public:
    DynamicSlotCreator(OBJ o, FUNC f) :
        obj(o), func(f)
    {}

public slots:

    void dynamicSlot()
    {
        (obj.*f)();
    }

};

main.cpp:

class Function
{
public:
    void greet()
    {
        qDebug() << "hello world";
    }
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QPushButton* pb = new QPushButton("Btn");
    pb->show();

    Function x;
    DynamicSlotCreator<Function, decltype(&Function::greet)> dsc(x, &Function::greet);

    QObject::connect(pb, SIGNAL(clicked()), &dsc, SLOT(dynamicSlot()));

    return a.exec();

}

ERRORS:

1>main.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl DynamicSlotCreator<class Function,void (__cdecl Function::*)(void)>::metaObject(void)const " (?metaObject@?$DynamicSlotCreator@VFunction@@P81@EAAXXZ@@UEBAPEBUQMetaObject@@XZ)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual void * __cdecl DynamicSlotCreator<class Function,void (__cdecl Function::*)(void)>::qt_metacast(char const *)" (?qt_metacast@?$DynamicSlotCreator@VFunction@@P81@EAAXXZ@@UEAAPEAXPEBD@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __cdecl DynamicSlotCreator<class Function,void (__cdecl Function::*)(void)>::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@?$DynamicSlotCreator@VFunction@@P81@EAAXXZ@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
SpellTheif
  • 715
  • 2
  • 12
  • 26

1 Answers1

0

Instead of a pointer to a function, you need to pass a pointer to QAction Something like this:

auto action = new QAction(myClass1);
connect(action, &QAction::triggered, myClass1, &MyClass1::myFunction);
... --> action
auto button = new QPushButton(myClass2);
connect(button, &QPushButton::clicked, action, &QAction::trigger);
avttrue
  • 387
  • 2
  • 12