正如一些评论中所述,这通常是由于多次调用 connect 造成的。每次建立连接时都会调用一次该插槽。例如,以下代码将导致slot()
被呼叫 3 次时signal()
被发射一次。
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
connect(obj, SIGNAL(signal()), obj2, SLOT(slot()));
如果您在可能多次运行的代码中进行连接,通常最好使用Qt::UniqueConnection
作为第5个参数。以下代码将导致slot()
被呼叫 1 次signal()
被发射一次。
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::DirectConnection
(对于单线程程序)。这会立即调用槽,就像函数调用一样。这意味着在断开连接发生之前可以再次调用 connect(如果程序中存在循环)。