c++ - 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”获得了一个附加参数,即回调插槽。有什么推荐的方法吗?
谢谢
解决方案
推荐阅读
- json - 网上有没有地方可以上传json文件并以html格式导出?
- java - 如何更新数组列表中的用户输入?
- webpack - 使用 /* 导入多个 scss 文件失败并使用 vue webpack
- iccube - IcCube 报告中的重叠标签
- php - 使用 Azure Key Vault 在 PHP 中保护连接字符串的最佳方法?
- sql - 等级与联盟
- c++ - 为什么将函数设为“静态”会导致我的程序有未定义的符号?
- c++ - C++ SFML 时钟疯狂输出
- javascript - 您将如何使用 componentDidUpdate 更新某些内容而无需刷新页面?
- postgresql - 在 PostgreSQL 中,我们如何判断一个表的每个索引是否是聚集的?