void CCDDS::init()
{
m_dds_recv = new fastdds(data_type_buf);
int domain_id = 2;
const char *topic = "recv";
m_dds_recv->set_history_qos(recv_real_time);
m_dds_recv->reg(domain_id, topic, recvData);
}
void CCDDS::recvData(void *data, int len)
{
// TODO
}
以上代码为fastdds注册接收信息的方法,当fastdds接收到信息时会自动回调recvData方法,但是不是在ui线程中回调,所以此时对ui的操作不会生效。此时可以通过向UI对象传递事件的方式传递信息,然后操作ui。
首先,定义一个事件类
/** 事件类,用于传递fastdds讯息 **/
class LogEvent: public QEvent
{
public:
LogEvent(QEvent::Type type = QEvent::User) : QEvent(type)
{
m_cmd = 0;
}
~LogEvent()
{
}
int cmd() const
{
return m_cmd;
}
void setCmd(int cmd)
{
m_cmd = cmd;
}
QString data() const
{
return m_data;
}
void setData(const QString &data)
{
m_data = data;
}
private:
int m_cmd;
QString m_data;
};
然后在类中定义事件处理方法
/** 自定事件处理 **/
bool CCDDS::event(QEvent *e)
{
if(e->type() == QEvent::User)
{
LogEvent *evt = dynamic_cast<LogEvent *>(e);
if(evt != nullptr)
{
int cmd = evt->cmd();
// TODO
}
}
return QWidget::event(e);
}
最重要的:在类外定义一个全局变量,且在类初始化时赋值用于传递信息
static QWidget* gWidget = nullptr;
CCDDS::CCDDS(QWidget *parent)
: QWidget{parent}
{
gWidget = this;
}
最后只需在回调方法构造发送事件即可
void CCDDS::recvData(void *data, int len)
{
if(gWidget == nullptr) {
return;
}
// 获取信息通过event传到类中
QString str_data = QString::fromLatin1((char *)data, len);
LogEvent* event = new LogEvent(QEvent::User);
event->setCmd(0x00);
event->setData(str_data);
QApplication::postEvent(gWidget, event);
}