将QMetaMethod作为参数传递给使用新QObject :: connect语法的函数

时间:2019-05-02 15:10:10

标签: c++ qt

我想使用在编译时进行类型检查的新语法来为QObject的连接构建一个包装器。 主要思想是:“嗨,听众,将此对象的插槽连接到我的newData信号上”

void Listener::_addClient(const QObject *object, const QMetaMethod& slot)
{
    connect(this, &Listener::newData, object, slot);
}

有些Client类可以做到:

Listener myListener;
myListener._addClient(this, &Client::mySlot);

这当然不会编译。

  • 由于所有Listener对象将归一个管理器类所有,因此我无法直接访问它们,因此无法进行传统的连接。

如何为该连接构建包装器,以便确保在编译时进行类型检查?

2 个答案:

答案 0 :(得分:0)

您可以使用模板:

template <typename Receiver, typename Slot>
void Listener::_addClient(const Receiver *object, const Slot& slot)
{
    connect(this, &Listener::newData, object, slot);
}

答案 1 :(得分:0)

我无法使用Jarod42解决方案,因为我需要访问受保护的属性并且该方法必须公开。

我最终进行了以下操作

void Listener::_addClient(const QObject *receiver, const char *slot)
{
        connect(this, SIGNAL(newData()), receiver, slot);
}

这样打电话

Listener myListener;
myListener._addClient(this, SLOT(mySlot()));

这可能不是进行操作的最主要方法,但它可行。