Пытается связать указатель на функцию-член с членом T шаблона класса, который затем вызывается в слоте - PullRequest
0 голосов
/ 11 ноября 2019

Я пытался создать соединение (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)

1 Ответ

0 голосов
/ 11 ноября 2019

Вместо указателя на функцию вам нужно передать указатель на QAction Примерно так:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...