Изменить порядок подключения сигнальных слотов - PullRequest
7 голосов
/ 24 декабря 2011

Недавно я столкнулся с проблемой с моим кодом, которая была вызвана определенным поведением, зависящим от порядка соединения сигнального слота в конкретном объекте. Это недостаток дизайна с моей стороны (связи всегда должны были быть динамическими, поэтому этот недостаток был неизбежен), но это заставило меня задуматься.

Можно ли переупорядочить соединения сигнальных слотов в объекте? И / или указать «индекс» соединения при его создании?

Я ценю, что вы можете смоделировать этот эффект, уничтожив все соединения и воссоздав их в новом порядке, но я не об этом. Я не смог найти ничего в API или общих документах, поэтому я подозреваю, что ответ - нет, но я все равно должен спросить ...

Ответы [ 2 ]

10 голосов
/ 24 декабря 2011

Вопреки тому, что казалось прошлым пониманием , я с удивлением прочитал обновление, которое (по крайней мере в последних версиях) Qt не оставило порядок вызова слотов как неопределенное:

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

http://doc.qt.io/qt-4.8/signalsandslots.html#signals

(Хотя можно утверждать, что одного предложения в этом одном документе недостаточно, чтобы представить «сильную» гарантию для всех версий Qt 4.X прошлого и будущего.)

Похоже, не существует API для переупорядочения сигналов и слотов. Даже если бы они были, я бы чувствовал, что полагаться на заказ не очень хорошая идея. Я бы предложил переосмыслить дизайн.

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

0 голосов
/ 13 июня 2017

QObject хранит соединения в виде списка. Использовать заголовок <private/qobject_p.h> просто, чтобы получить блокировку в списке соединений отправителя и изменить порядок его записей. Публичный API сделал бы эту деталь фиксированной на время каждой основной ревизии Qt, и это считалось слишком ограничивающим.

...