簡體   English   中英

C ++ QT:以指針指示信號和插槽功能的函數

[英]C++ QT: Function Taking Pointer To Signal And Slot Function

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來指定僅希望QMqttClient Signal功能? Slot作為參數傳遞的好方法是什么?

我在這里閱讀有關信號和插槽的信息:

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

QMqttCLient的文檔

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

您可以使用模板將信號和插槽作為參數傳遞。

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個參數滿足您的要求。

如果您有一個特定的簽名,那么它可以很簡單:

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

否則,另一個答案中的模板化版本會更加靈活。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM