1

在我的应用程序中,我们在信号槽之间建立了一个简单的连接。

    connect(&A, SIGNAL(signal(myObject)), &B, SLOT(slot(myObject));

不幸的是,这种联系会导致递归。然后我们把它改成

    connect(&A, SIGNAL(signal(myObject)), &B, SLOT(slot(myObject)), Qt::QueuedConnection);

它不再起作用了。该插槽永远不会被调用。

我尝试更改myObjectaQString并且它按预期工作。所以问题myObject在于Qt不太喜欢。

我检查了Class Qt.ConnectionTypeSignals & SlotsQObject doc,寻找Qt::QueuedConnection但我没有找到对我的情况的澄清。

关于我的代码的一些注释:

  • myObject信号发射后立即破坏。但这不应该是一个问题,可以制作一个副本(就像我想的那样,QString 没有这个问题,我的意思是,即使我通过一个临时QString的并在信号发射后立即销毁它,插槽无论如何都按预期调用)

  • myObject不是 a QObject,并且它的成员中没有一个是 a QObject(如果它可以产生一些影响)

  • myObject可以复制

  • 我的应用程序是单线程

  • myObject没有默认构造函数(但我认为它不应该影响它,因为可以制作副本)

  • 我正在使用 Qt 5.7

有人对这个问题有一些澄清吗?

实际上,文档Qt::QueuedConnection似乎没有那么详细,请参阅我上面发布的链接。你有一些更有用的链接吗?

4

1 回答 1

4

通过以下方式注册您的 myObject:

qRegisterMetaType<MyObject>("myObject");

其中 MyObject 是类名。文档

之间,Qt::QueuedConnection 用于通过线程进行连接,您使用的是线程吗?

于 2018-07-27T13:33:31.357 回答