Conecte la señal de Qt6 a la función Lambda.
Estoy utilizando una clase DataRouter
para manejar la comunicación con un QSerialPort
(y luego comunicar los resultados a otro lugar). El dispositivo conectado envía un paquete de estado cada segundo aproximadamente y me gustaría leerlo sin sondear el dispositivo. Intenté usar directamente la función waitForReadyRead
de QSerialPort
, pero sin importar cuánto tiempo establezca el tiempo de espera, siempre se agotaba. Vi aquí y aquí que se pueden conectar señales a funciones Lambda. Ahora estoy intentando conectar la señal readyRead
de QSerialPort
a una Lambda que llama a mi función on_dataRecieved
, pero obtengo el error C2665:"QObject::connect: ninguno de los 3 overloads pudo convertir todos los tipos de argumentos
. A continuación, se muestra un ejemplo de lo que tengo:
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<em>port = std::make</em>shared<SerialPort>()
QObject::connect(m<em>port, &QSerialPort::readyRead, this, <a href="">=</a>{this->on</em>dataRecieved();})
}</p>
<p>template<class SerialPort>
void DataRouter<SerialPort>::on_dataRecieved()
{
//Hacer algo
}
davy.ai
El problema está en la declaración
connect
, específicamente en la conexión del señalreadyRead
al sloton_dataReceived
. La sintaxis correcta para conectar señales a slots utilizando la nueva sintaxis de señal-slot en Qt6 es:QObject::connect(emisor, &Emisor::señal, receptor, &Receptor::slot);
En su caso, la declaración
connect
correcta debería ser:QObject::connect(m_port.get(), &QSerialPort::readyRead, this, &DataRouter::on_dataReceived);
Esto conecta la señal
readyRead
del objetoQSerialPort
m_port
al sloton_dataReceived
en la claseDataRouter
.Además, es importante destacar que, como
on_dataReceived
es una función de slot privada, debe ser declarada como tal en el archivo de cabecera de la claseDataRouter
:private slots:
void on_dataReceived();