C ++ QT:将指针指向信号和插槽功能的功能

时间:2018-04-08 08:55:09

标签: c++ qt

QT 5.1:

要删除冗余代码,我想将公共逻辑外包,以下两个函数调用包含:

client.cpp

void Client::connectToSignals()
{
    QObject::connect(Client::mqtt.get(), &QMqttClient::connected, this,
                     &Client::onConnected);
    QObject::connect(Client::mqtt.get(), &QMqttClient::disconnected, this,
                     &Client::onDisconnected);
}

所以Client::mqtt.get()和上下文this始终保持不变。因此,该方法需要将signalslot作为参数。 slot函数始终在client.h中定义。

没有参数的新函数的方法体看起来像这样:

void Client::connectToMqttSignal(){}

哪种类型可以用于参数?我可以通过设置特定类型而不在运行时检查类型ID来指定我只需要来自Signal的{​​{1}}个函数吗?什么是传递QMqttClient作为参数的好方法?

我在这里读到有关信号和插槽的信息:

https://doc.qt.io/qt-5/signalsandslots.html

Slot

的文档

https://doc.qt.io/QtMQTT/index.html

2 个答案:

答案 0 :(得分:3)

您可以使用模板将信号和插槽作为参数传递。

template <typename Func1, typename Func2>
static inline QMetaObject::Connection conWrapper(const typename QtPrivate::FunctionPointer<Func1>::Object *sender, Func1 signal,
                                 const typename QtPrivate::FunctionPointer<Func2>::Object *receiver, Func2 slot,
                                 Qt::ConnectionType type = Qt::AutoConnection)
{
    return QObject::connect(sender, signal, receiver, slot, type);
}

示例用法语法:

conWrapper(this, &MainWindow::someSignal, this, &MainWindow::someSlot);

您只需将发件人替换为Client::mqtt.get(),将接收者替换为this,并删除2个参数以满足您的要求。

答案 1 :(得分:2)

如果你有一个特定的签名,那么它可以很简单:

QMetaObject::Connection Client::connectMqtt((QMqttClient::*signal)(), 
                                            (Client::*slot)())
{
  return connect(mqtt.get(), signal, this, slot);
}

否则,另一个答案中的模板化版本更灵活。