В Qt много слотов, подключенных к одному и тому же сигналу, они вызывают по порядку, когда испускают сигнал?
В Qt
В документе сказано:
если несколько слотов подключены к одному сигналу, слоты будут выполняться один за другим, в том порядке, в котором они были подключены, когда излучается сигнал.
Но в connect()
функция, настройка Qt::ConnectionType
введите как Qt::QueuedConnection
означает "Слот вызывается, когда управление возвращается в цикл обработки событий получателя. Слот выполняется в потоке получателя". а также Qt::DirectConnection
означает "слот вызывается немедленно, когда излучается сигнал". Слоты могут быть выполнены не по порядку.
Они противоречат друг другу?
2 ответа
Если несколько слотов имеют Qt::DirectConnection
, они будут вызываться в порядке их подключения. Если несколько слотов имеют Qt::QueueConnection
, они будут вызываться в порядке их подключения. Если смешивать и сочетать, то все Qt::DirectionConnection
Слоты будут вызываться по порядку, а затем, когда управление возвращается в цикл событий, все Qt::QueuedConnection
Слоты будут вызывать по порядку.
Обратите внимание, что, хотя порядок вызова слотов известен, его зависимость почти всегда приводит к хрупкому коду. Связи должны быть динамическими. Им довольно трудно быть динамическими, когда вы зависите от порядка соединений, оставшихся статичными. Если у вас есть код, который действительно зависит от порядка подключения, вы должны реорганизовать его так, чтобы порядок выполнения контролировался каким-либо другим способом, или иначе он станет известен сопровождающему кода, что действия должны быть упорядочены.