Qt6 将信号连接到 Lambda 函数
Qt6 Connect Signal to Lambda Function
我正在使用 DataRouter
class 来处理与 QSerialPort
的通信(然后将结果传送到其他地方)。连接的设备大约每秒发送一个状态包,我想在不轮询设备的情况下读取它。我尝试直接使用QSerialPort
的waitForReadyRead
函数,但是无论我设置等待时间多长,总是超时。查看 here and here 我看到信号可以连接到 Lambda 函数。现在我正在尝试将 QSerialPort
的 readyRead
信号连接到调用我的 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);
我正在使用 DataRouter
class 来处理与 QSerialPort
的通信(然后将结果传送到其他地方)。连接的设备大约每秒发送一个状态包,我想在不轮询设备的情况下读取它。我尝试直接使用QSerialPort
的waitForReadyRead
函数,但是无论我设置等待时间多长,总是超时。查看 here and here 我看到信号可以连接到 Lambda 函数。现在我正在尝试将 QSerialPort
的 readyRead
信号连接到调用我的 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);