QObject::connect的函数包装器

4
我正在尝试编写一个函数,该函数将其参数传递给 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

但是我无法弄清楚为什么它不起作用。

为什么你要传递值? - deW1
@deW1 我正在传递函数指针,为什么不按值传递呢?QObject::connect具有相同的签名。 - jaho
2个回答

4

您的问题在于,您试图传递一个指向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);
}

当然,我假设传递lambda有问题,完全忽略了这一点。我也喜欢你的解决方案,因为它不必使用Qt的私有API。 - jaho

0

你读过编译器错误信息了吗?编译器在5个重载函数中找不到合适的QObject::connect()函数。

QT文档

如果你使用以下代码,编译将会成功。

addConnection( &m_scannerSystem, SIGNAL( signalStatus( int ) ), this, SLOT( onStatusChanged( int ) ) );

我无法使用这个重载来连接到lambda。我正在使用新的Qt 5语法:https://wiki.qt.io/New_Signal_Slot_Syntax - jaho
我不明白为什么你只使用了一个lambda。我认为在这种情况下,lambda并不是必需的。我错了吗? - hyun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接