Qt6 将信号连接到 Lambda 函数

Qt6 Connect Signal to Lambda Function

我正在使用 DataRouter class 来处理与 QSerialPort 的通信(然后将结果传送到其他地方)。连接的设备大约每秒发送一个状态包,我想在不轮询设备的情况下读取它。我尝试直接使用QSerialPortwaitForReadyRead函数,但是无论我设置等待时间多长,总是超时。查看 here and here 我看到信号可以连接到 Lambda 函数。现在我正在尝试将 QSerialPortreadyRead 信号连接到调用我的 on_dataRecieved 函数的 Lambda,但我收到错误 C2665:"QObject::connect: none of the 3 overloads could convert all of the argument types。以下是我所拥有的示例:

DataRouter.h

template<class SerialPort>
class DataRouter
{
public:
    DataRouter ();
private slots:
    on_dataRecieved();
private:
    shared_ptr<SerialPort> m_port;
};

DataRouter.cpp

template<class SerialPort>
DataRouter<SerialPort>::DataRouter()
{
    m_port = std::make_shared<SerialPort>()
    QObject::connect(m_port, &QSerialPort::readyRead, this, [=](){this->on_dataRecieved();})
}

template<class SerialPort>
void DataRouter<SerialPort>::on_dataRecieved()
{
 //Do stuff
}

您的 m_port 不是 QSerialPort class 的实体,这就是为什么您没有 QSerialPort::readyRead 可以从中发出的原因。 template<class SerialPort> 不会做什么,它只是模板化参数的名称。 你可能想要这样的东西:

DataRouter.h

class DataRouter : QObject
{
public:
    DataRouter ();
private slots:
    on_dataRecieved();
private:
    QSerialPort* m_port;
};

DataRouter.cpp

DataRouter::DataRouter()
{
    m_port = new QSerialPort(this);
    connect(m_port, &QSerialPort::readyRead, this, &DataRouter::on_dataRecieved);
    // or connect(m_port, &QSerialPort::readyRead, this, [this](){this->on_dataRecieved();});
}

void DataRouter::on_dataRecieved()
{
 //Do stuff
}

您不必将 Qt classes 包装在智能指针中,只要您为它们提供父 class 即可。父级被破坏时释放内存。

如果您的“目标”不是 QObject,您需要使用 connect 的以下重载。问题是,您试图使用非 QObject 作为“上下文”来确定连接的生命周期,这是不可能的。为了减轻它,您需要在 DataRouter 销毁时以某种方式释放连接;一种方法是存储 connect() 将返回的内容,稍后调用 disconnect

关于智能指针发出的信号,你有没有试过这个: connect(m_port->get(), &QSerialPort::readyRead, &DataRouter::on_dataRecieved);