Обертка функции вокруг QObject::connect

Я пытаюсь написать функцию, которая передает свои аргументы QObject::connect,

template <typename Func1, typename Func2>
void addConnection(const QObject* sender, Func1 signal, Func2 slot)
{
    m_connections.push_back(QObject::connect(sender, signal, slot));
}

и вот как я это называю:

addConnection(&m_scannerSystem, &ScannerSystem::signalStatus, [=](int status){ this->onStatusChanged(status); });

Это приводит к ошибке:

'QObject::connect' : none of the 4 overloads could convert all the argument types

но я не могу понять, почему это не работает.

2 ответа

Решение

Ваша проблема в том, что вы пытаетесь передать указатель на QObject, но как в этом случае вы сможете вызывать функцию-член другого объекта (ScannerSysterm в вашем случае)? Система должна знать фактический тип переданного отправителя. Так что вы можете исправить это так:

template <typename Sender, typename Func1, typename Func2>
void addConnection(const Sender* sender, Func1 signal, Func2 slot)
{
    QObject::connect(sender, signal, slot);
}

Или используя некоторые магические черты Qt:

template <typename Func1, typename Func2>
void addConnection(const typename QtPrivate::FunctionPointer<Func1>::Object* sender, Func1 signal, Func2 slot)
{
    QObject::connect(sender, signal, slot);
}

Вы прочитали сообщение об ошибке компилятора? Компилятор не знает подходящего QObject::connect() функция среди 5 функций перегрузки. QT doc

Если вы используете приведенный ниже код, компиляция будет успешной.

addConnection( &m_scannerSystem, SIGNAL( signalStatus( int ) ), this, SLOT( onStatusChanged( int ) ) );
Другие вопросы по тегам