Обертка функции вокруг 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 ) ) );