关于QT信号发送失败的另个原因分析

1、QT的信号和槽之间关联,系统默认是线程内,默认不支持跨线程调用,因此如果需要跨线程信号传递,则需要再connect的第五个参数:

Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。

2、绑定的消息,如果参数为自定义的数据体,则需要进行注册数据体,系统默认常用的类型变量,如果自定义结构体,则需创建连接之间注册一次,语法:qRegisterMetaType<MyStruct >("MyStruct ")

在上面的代码中,我们使用了一个名为 qRegisterMetaType 的函数来注册我们的结构体。这个函数是 Qt 库中的一个工具,它允许我们向元数据系统注册自定义的数据类型,以便在程序中方便地使用它们。 我们通过传递结构体的类型参数来注册我们的数据类型。在这个例子中,我们传递了名为 MyStruct 的结构体作为参数,并给它赋予了一个字符串 'MyStruct' 的标识符。 一旦我们成功地注册了 MyStruct 数据类型,我们就可以在程序中通过这个标识符来访问它。例如,我们可以使用 qMetaTypeId 函数来获取 MyStruct 的类型 ID,或者使用 qRegisterMetaType 函数来注册其他结构体或类。 值得注意的是,qRegisterMetaType 函数在程序启动时只会执行一次,因此我们需要确保在需要使用自定义数据类型的地方正确地引入了它。

3.偶尔会遇到一个对象的在某些情况下会被多次connect的情况,为了应对这个情况需要

在connect操作的时候加上flag:Qt::UniqueConnection

例如:

  1. QObject a;

  2. QObject b;

  3. connect(&a, &QObject::signal, &b, &QObject::slot, Qt::UniqueConnection);
  4. connect(&a, &QObject::signal, &b, &QObject::slot, Qt::UniqueConnection);

这样之后第二次connect将会失败,可以避免多次connect之后发送一个信号触发多个槽的情况。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值