赞
踩
- 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);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。