Я пытался создать соединение (QObject::connect
) во время выполнения.
Я хотел передать указатель на функцию-член в другой шаблон класса. Он успешно выполнен, но во время выполнения возникли ошибки ссылки.
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();
}
ОШИБКИ:
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)