Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT将插槽作为参数作为回调传递_C++_Qt_Callback_Signals_Slot - Fatal编程技术网

C++ QT将插槽作为参数作为回调传递

C++ QT将插槽作为参数作为回调传递,c++,qt,callback,signals,slot,C++,Qt,Callback,Signals,Slot,我是C++/Qt新手,在编写使用串行总线连接到多个其他设备的应用程序时遇到了一些问题 对于通信,我编写了一个类来包装QtSerialBus并进行一些编码/校验和计算等。这个类应该可以被我程序中的其他不同类/线程/模块使用 此包装器类简化如下: 标题: class PeripherieCommunicator : public QObject { Q_OBJECT public: explicit PeripherieCommunicator(std::shared_ptr<MultiMa

我是C++/Qt新手,在编写使用串行总线连接到多个其他设备的应用程序时遇到了一些问题

对于通信,我编写了一个类来包装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);
    };
到目前为止,它工作得很好,这意味着命令是通过串行总线发送并执行的。但是,总线上的大多数设备将发送我需要处理的回复。 到目前为止,我尝试的是在发送处理应答的命令并发出相应信号之前,在中连接了一个lamba函数。但这将导致这样的情况,即连接到该信号的每个插槽都被调用。 我想实现的是某种回调功能。这意味着,例如,插槽“CardTypeAGetFullDeviceInfo”会获得一个额外的参数,即回调插槽。 有什么推荐的方法可以做到这一点吗


谢谢

我想,这可以通过其他方式解决。请您解释一下应该一步一步地发生什么-从发送消息和从设备接收答案,到处理答案和执行特定操作。我现在使用BlockingQueuedConnection来实现这一目的,因为我无论如何都会等待返回
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);
}