C++ Qt::QueuedConnection无法处理某些对象
在我的应用程序中,信号插槽之间有一个简单的连接C++ Qt::QueuedConnection无法处理某些对象,c++,qt,queued-connection,C++,Qt,Queued Connection,在我的应用程序中,信号插槽之间有一个简单的连接 connect(&A, SIGNAL(signal(myObject)), &B, SLOT(slot(myObject)); 不幸的是,这种连接将导致递归。然后我们把它改成了 connect(&A, SIGNAL(signal(myObject)), &B, SLOT(slot(myObject)), Qt::QueuedConnection); 而且它已经不起作用了。插槽从未被调用 我尝试将m
connect(&A, SIGNAL(signal(myObject)), &B, SLOT(slot(myObject));
不幸的是,这种连接将导致递归。然后我们把它改成了
connect(&A, SIGNAL(signal(myObject)), &B, SLOT(slot(myObject)), Qt::QueuedConnection);
而且它已经不起作用了。插槽从未被调用
我尝试将myObject
更改为QString
,结果它按预期工作。所以问题在于myObject
中的某些东西,Qt不太喜欢
我检查并查找了Qt::QueuedConnection
,但没有找到对我的情况的说明
关于我的代码的一些注释:
- 发出信号后,
立即被破坏。但这不应该是一个问题,可以制作一个副本(我认为是针对QString的,这没有这个问题,我的意思是,即使我传递了一个临时myObject
,并在信号发出后立即销毁它,插槽也会按预期调用)QString
不是myObject
,其成员中没有一个是QObject
(如果它可以产生一些影响)QObject
可以复制myObject
- 我的应用程序是单线程的
没有默认构造函数(但我认为它不应该影响它,因为可以复制)myObject
- 我正在使用Qt5.7
实际上,
Qt::QueuedConnection
的文档似乎没有那么详细,请参见我上面发布的链接。您有更有用的链接吗?通过以下方式注册您的myObject:
qRegisterMetaType<MyObject>("myObject");
qRegisterMetaType(“myObject”);
其中MyObject是类名
在之间,Qt::QueuedConnection用于通过线程进行连接,您正在使用线程吗?通过以下方式注册myObject:
qRegisterMetaType<MyObject>("myObject");
qRegisterMetaType(“myObject”);
其中MyObject是类名
Between,Qt::QueuedConnection用于通过线程进行连接,您正在使用线程?请提供一个复制此问题的方法。它在执行
connect
后是否在输出窗口中打印任何内容?@G.M.我会的,但现在让我重新表述这个问题:)您是否有Qt的文档链接,为了更好地理解信号/插槽的参数必须满足哪些条件?(从我的问题来看,我想应该有一些条件,但我找不到有关它的信息。)@Pham Anh Tuan你是说类似“没有这样的信号/插槽”的警告?不,我查过了…@n3mo是的,这就是我的意思。因此,连接
很好。确保B
对象在发出信号之前未被破坏,并且在connect
之后发出信号。请提供一个重现问题的方法。执行connect
后,它是否在输出窗口中打印任何内容?@G.M.我会,但现在,让我重新表述这个问题:)你有Qt的文档链接吗,为了更好地理解信号/插槽的参数必须满足哪些条件?(从我的问题来看,我想应该有一些条件,但我找不到有关它的信息。)@Pham Anh Tuan你是说类似“没有这样的信号/插槽”的警告?不,我查过了…@n3mo是的,这就是我的意思。因此,连接
很好。确保B
对象在发出信号之前未被破坏,并且在connect
之后才发出信号。我将测试您的建议,谢谢。我没有线程,我只是有一个我想要避免的递归。@n3mo为了避免递归,您必须更改连接,而不是连接类型。@Phiber即使QueuedConnection
最常用于线程,通常它只是将信号放在拥有线程的对象事件循环堆栈的顶部,所以你也可以不用多线程来使用它。@Rudolfs我同意这确实是正确的答案。如果您想添加到您的答案中,我认为以下两个链接有助于更好地理解,尤其是引用:要注册用于排队信号和插槽(如跨线程通信中使用的信号和插槽)的自定义类型,请参阅排队自定义类型示例。我不知道排队信号与正常信号的工作方式不同。谢谢我会测试你的建议,谢谢。我没有线程,我只是有一个我想要避免的递归。@n3mo为了避免递归,您必须更改连接,而不是连接类型。@Phiber即使QueuedConnection
最常用于线程,通常它只是将信号放在拥有线程的对象事件循环堆栈的顶部,所以你也可以不用多线程来使用它。@Rudolfs我同意这确实是正确的答案。如果您想添加到您的答案中,我认为以下两个链接有助于更好地理解,尤其是引用:要注册用于排队信号和插槽(如跨线程通信中使用的信号和插槽)的自定义类型,请参阅排队自定义类型示例。我不知道排队信号与正常信号的工作方式不同。谢谢