es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema está en la declaración connect, específicamente en la conexión del señal readyRead al slot on_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 objeto QSerialPort m_port al slot on_dataReceived en la clase DataRouter.

    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 clase DataRouter:

    private slots:
    void on_dataReceived();

Comments are closed.