Qt6连接QSerialPort的readyRead信号到Lambda函数报C2665错误如何解决
错误根因
你遇到的C2665编译错误由以下几个问题共同导致:
QObject::connect的第一个参数要求传入QObject*类型的信号发送方指针,你直接传入了shared_ptr<SerialPort>类型的m_port,类型不匹配。DataRouter模板类没有继承QObject,无法作为信号槽连接的上下文参数传入connect,也不能声明Qt槽函数。- 代码中
make_shared调用、connect调用行末尾都遗漏了分号,属于基础语法错误。 - 模板类的实现放在
.cpp文件中会导致外部调用时无法找到模板实例化的实现,后续运行会出现链接错误。 - 你声明的
on_dataRecieved槽函数没有指定返回值,Qt槽函数要求明确返回void。
修复方案
将模板类的完整实现移到头文件,让DataRouter继承QObject并添加Q_OBJECT宏,修正connect的参数类型:
DataRouter.h 完整代码
#include <QObject> #include <memory> #include <QSerialPort> template<class SerialPort> class DataRouter : public QObject { Q_OBJECT public: DataRouter (); private slots: void on_dataRecieved(); private: std::shared_ptr<SerialPort> m_port; }; template<class SerialPort> DataRouter<SerialPort>::DataRouter() { m_port = std::make_shared<SerialPort>(); // 用SerialPort::readyRead保证泛型兼容性,用m_port.get()拿到发送方指针 QObject::connect(m_port.get(), &SerialPort::readyRead, this, [=](){ this->on_dataRecieved(); }); } template<class SerialPort> void DataRouter<SerialPort>::on_dataRecieved() { // 此处添加串口数据读取、转发逻辑 }
额外说明
- 继承
QObject并传入this作为上下文的写法,可以保证DataRouter实例销毁时,对应的信号槽连接会自动断开,避免lambda访问野指针的问题。 - 不需要再调用
waitForReadyRead,通过readyRead信号触发读取的逻辑本身就是异步非轮询的,符合你的需求。
内容的提问来源于stack exchange,提问作者paperplate
相关产品推荐
相关产品推荐

