首页 > 解决方案 > QT将插槽作为参数作为回调传递

问题描述

我对 C++/Qt 很陌生,并且在编写使用连接到多个其他设备的 SerialBus 连接的应用程序时遇到了一些问题。

对于通信,我编写了一个包装 QtSerialBus 并进行一些编码/校验和计算等的类。这个类应该可以被我程序中的不同其他类/线程/模块使用。

这个包装类看起来像这样简化:

标题:

class PeripherieCommunicator : public QObject
{
Q_OBJECT

public:
explicit PeripherieCommunicator(std::shared_ptr<MultiMasterCommunicator> mmcom, QObject *parent = nullptr);
~PeripherieCommunicator();
private:
std::shared_ptr<MultiMasterCommunicator> mmcom;

template<typename T1> void send(unsigned char command, unsigned char destAddress, T1 sendItem = nullptr) {
    auto sendBuffer = QByteArray::fromRawData(reinterpret_cast<const char*>(&sendItem), sizeof(T1));
    emit sendCommand(command, destAddress, sendBuffer);
}

signals:
    void sendCommand(unsigned char command, unsigned char destAddress, QByteArray sendBuffer = nullptr);
    void openPort();

public slots:
  void CardTypeAGetFullDeviceInfo(unsigned char ucAddress);
  void CardTypeBStartPositioning(unsigned char ucMotorNbr, signed long slPosition, signed long slSpeed, signed long slAcceleration, unsigned char ucAddress);
signals:
    void CardTypeAFullDeviceInfoReceived(CARDA_FULL_DEVICE_INFO strFullDeviceInfo);
    void CardTypeBStartPositioningReceived(unsigned short usCMDAnswer);
    };

插槽的示例定义:

void PeripherieCommunicator::PR112StartPositioning(unsigned char ucMotorNbr, 
signed long slPosition, signed long slSpeed, signed long slAcceleration, 
unsigned char ucAddress)
{
    CARDTYPEA_START_POSITIONING data;
    data.usMotorNumber = ucMotorNbr;
    data.slDestinationPosition = slPosition;
    data.slSpeed = slSpeed;
    data.slAcceleration = slAcceleration;
    send(COMMAND_START_POSITIONING , ucAddress, data);
}

到目前为止,这工作正常,这意味着命令正在通过 SerialBus 发送并执行。但是,总线上的大多数设备都会发送我需要处理的回复。到目前为止,我尝试的是在发送将处理回复并发出相应信号的命令之前连接了一个 Lamba 函数。但这将导致连接到该信号的每个插槽都被调用的情况。相反,我想要实现的是某种回调功能。这意味着例如插槽“CardTypeAGetFullDeviceInfo”获得了一个附加参数,即回调插槽。有什么推荐的方法吗?

谢谢

标签: c++qtcallbacksignalsslot

解决方案


推荐阅读