qt中fastdds向主线程传递消息

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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT,可以通过以下步骤将主线程的参数传递给子线程: 1. 定义一个继承自`QThread`的子类,例如`MyThread`。 2. 在`MyThread`类定义一个成员变量,用于保存需要传递的参数,例如`args`。 3. 在`MyThread`类重写`run`方法,在`run`方法访问`args`成员变量,执行子线程的任务。 4. 在主线程创建`MyThread`对象,并将需要传递的参数设置给`args`成员变量。 5. 调用`MyThread`对象的`start`方法启动子线程。 以下是一个简单的示例代码: ```python from PyQt5.QtCore import QThread class MyThread(QThread): def __init__(self, args): super().__init__() self.args = args def run(self): # 在子线程访问args成员变量,执行子线程的任务 print("args:", self.args) # 在主线程创建MyThread对象,并将需要传递的参数设置给args成员变量 args = ("hello", "world") my_thread = MyThread(args) # 调用MyThread对象的start方法启动子线程 my_thread.start() ``` 在上面的示例代码,我们定义了一个继承自`QThread`的子类`MyThread`,并在`MyThread`类定义了一个成员变量`args`,用于保存需要传递的参数。在`MyThread`类重写了`run`方法,在`run`方法访问了`args`成员变量。在主线程,我们创建了`MyThread`对象,并将需要传递的参数`(hello, world)`设置给了`args`成员变量。最后,调用`MyThread`对象的`start`方法启动子线程。这样,子线程就可以访问主线程传递的参数了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值