【问题标题】:Qt Signal over writing previousQt 信号覆盖前一个
【发布时间】:2014-03-10 22:43:12
【问题描述】:

我有两个类,Class1、Class2(单例),都使用 QT 信号和插槽。每个类都包含独立类Message的实例:分别为Msg1、Msg2

Class1:来自 Msg1 的 Signal-X 连接到 Class1 slotX

Class2:来自 Msg2 的 Signal-X 连接到 Class2 slotY。

当 Class1 被实例化时,构造函数导致两条消息被发送到 Message Class,这将导致 Message Class 发出 Signal-X。两条消息意味着 Signal 发出了两次(使用不同的参数数据)。我在 Class1、Class2 的信号和插槽连接期间都使用了 Qt:AutoConnection。

通常一切都按预期正常工作。但是有时我注意到, Class1::SlotX() 没有被解雇两次,而 Class2::SlotY() 被解雇了两次!两种情况的信号源都是一样的!!!

  1. 是否有可能在 Class1 事件循环繁忙时,在使用 Class1::SlotX() 之前,第二个 Signal-X 会覆盖第一个 Signal-X?对于 Singleton 类 Class2,没有问题。 Class2::SlotY() 总是被触发两次。

  2. QT 信号和槽连接是否紧跟在 Connect() 之后?还是只连接信号和插槽需要时间?

有人可以帮忙吗... 提前致谢

【问题讨论】:

  • 您是否将 printf() 调用直接放在“发射信号”行上方,并验证您的信号实际上被发射了两次,并且这些发射实际上是在它们相应的 connect( ) 来电?
  • 另外,你的对象是什么时候构造的?如果它们是静态的,并且在 main() 之前构造,那可能是个问题。
  • @JeremyFriesner 我可以确认 Singleton Class2::SlotY() 被调用了两次,这意味着信号被发射了两次!但不是 Class1::SlotX() :-(
  • 也许你错误地将两个信号都连接到了 SlotY?如果您发布代码,人们可能会发现其中的错误。
  • 很难说。也许一些代码? (请不要整个项目,只是简单的声明,连接发生的位置以及实例化对象的位置);)

标签: c++ qt qt4 signals-slots


【解决方案1】:

这里试图回答你的问题 2。

根据您的 Class1 Class2 和 Message 类是否在同一个线程中,Qt::AutoConnection 将导致不同的行为。

如果两者都在同一个线程上,则会导致直接连接,因此直接调用槽,作为回调,而不调用事件循环。

如果不在同一个线程上,它是通过事件循环间接调用的,所以实际上你无法保证接收者的slot什么时候执行。

对于第一季度,如 Jeremy Friesner 所述,需要代码示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2017-04-07
    • 2014-12-22
    • 2016-10-22
    • 2010-09-15
    相关资源
    最近更新 更多