В Qt много слотов, подключенных к одному и тому же сигналу, они вызывают по порядку, когда испускают сигнал?

В Qt В документе сказано:

если несколько слотов подключены к одному сигналу, слоты будут выполняться один за другим, в том порядке, в котором они были подключены, когда излучается сигнал.

Но в connect() функция, настройка Qt::ConnectionType введите как Qt::QueuedConnection означает "Слот вызывается, когда управление возвращается в цикл обработки событий получателя. Слот выполняется в потоке получателя". а также Qt::DirectConnection означает "слот вызывается немедленно, когда излучается сигнал". Слоты могут быть выполнены не по порядку.

Они противоречат друг другу?

2 ответа

Если несколько слотов имеют Qt::DirectConnection, они будут вызываться в порядке их подключения. Если несколько слотов имеют Qt::QueueConnection, они будут вызываться в порядке их подключения. Если смешивать и сочетать, то все Qt::DirectionConnection Слоты будут вызываться по порядку, а затем, когда управление возвращается в цикл событий, все Qt::QueuedConnection Слоты будут вызывать по порядку.

Обратите внимание, что, хотя порядок вызова слотов известен, его зависимость почти всегда приводит к хрупкому коду. Связи должны быть динамическими. Им довольно трудно быть динамическими, когда вы зависите от порядка соединений, оставшихся статичными. Если у вас есть код, который действительно зависит от порядка подключения, вы должны реорганизовать его так, чтобы порядок выполнения контролировался каким-либо другим способом, или иначе он станет известен сопровождающему кода, что действия должны быть упорядочены.

Другие вопросы по тегам