Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt::QueuedConnection无法处理某些对象_C++_Qt_Queued Connection - Fatal编程技术网

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
,但没有找到对我的情况的说明

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

  • 发出信号后,
    myObject
    立即被破坏。但这不应该是一个问题,可以制作一个副本(我认为是针对QString的,这没有这个问题,我的意思是,即使我传递了一个临时
    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我同意这确实是正确的答案。如果您想添加到您的答案中,我认为以下两个链接有助于更好地理解,尤其是引用:要注册用于排队信号和插槽(如跨线程通信中使用的信号和插槽)的自定义类型,请参阅排队自定义类型示例。我不知道排队信号与正常信号的工作方式不同。谢谢