Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++ 每次发出信号时都会多次调用插槽_C++_Qt_Qt4 - Fatal编程技术网

C++ 每次发出信号时都会多次调用插槽

C++ 每次发出信号时都会多次调用插槽,c++,qt,qt4,C++,Qt,Qt4,我在一个块中使用一个信号和插槽连接。我的代码如下 在a.cpp中 { QObject::connect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()), this,SLOT(GetFlang1DimAftrAnalysis())); m_ptheFlange2Details->get();// one function inside which i am emiting

我在一个块中使用一个信号和插槽连接。我的代码如下

在a.cpp中

{
 QObject::connect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()),
                 this,SLOT(GetFlang1DimAftrAnalysis()));

 m_ptheFlange2Details->get();// one function inside which i am emiting
                             // GetFlang1DimAfterAnalysis() signal ;

 QObject::disconnect(m_ptheFlange2Details,SIGNAL(GetFlang1DimAfterAnalysis()),
                     this,SLOT(GetFlang1DimAftrAnalysis()));

}

在get()函数中,当执行此emit语句时,会多次调用插槽。根据我的说法,它应该只调用一次。

正如一些评论中所述,这通常是由于多次调用connect造成的。每次连接时都会调用插槽一次。例如,当发出一次
signal()
时,以下代码将导致调用
slot()
三次

connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection);
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection);
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection);
如果您在代码中执行的连接可能会运行多次,通常最好使用
Qt::UniqueConnection
作为第五个参数。当发出一次
signal()
时,以下代码将导致调用
slot()
一次

connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection);
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection);
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()), Qt::UniqueConnection);

我猜您的代码不能正常工作的原因是您忽略了第5个参数,并且默认连接为
Qt::DirectConnection
(对于单线程程序)。这会立即调用插槽,就像调用函数一样。这意味着在断开连接之前可以再次调用connect(如果程序中存在循环)。

是否确保未多次调用
connect
??!!!请再给我们看一点代码。在哪个函数中编写了
connect
disconnect
?在
get()
中调用了多少次
emit
?此代码看起来不错。现在发布代码中丑陋的部分!检查
QObject::disconnect(…)
是否返回
true
。如果是,那么这部分代码就可以了。您可能在
get()
或其他地方遇到问题。我在get()中只使用了一个emit语句,那么这个插槽如何调用大量时间??QObject::disconnect(--)也返回true。我不明白是什么问题。。。我是否应该选择QObject::uniqueconnection(),如果您正在发出信号,那么只有插槽被调用正确??无论您使用connect语句多少次。。你能描述一下关于Qt::uniqueconnection的内容吗..因为我是Qt新手,所以不要对它有更多的了解..除非你使用Qt::uniqueconnection,否则调用connect的次数是很重要的。如果在函数中进行连接,并且多次调用该函数,则需要使用Qt::UniqueConnection,否则插槽将被调用多次。我编辑了我的帖子,试图更好地展示这一点。