Определите сигналы, подключенные к данному слоту в Qt - PullRequest
26 голосов
/ 03 мая 2010

Я ввел себя в приложение Qt и пытаюсь выяснить, к каким сигналам подключен данный слот, но не могу найти никакой информации о том, как это сделать. Есть ли механизм для этого из коробки? Если так, это подвергается QtScript? (Если нет, я могу обернуть это достаточно легко.)

Если такого механизма не существует, как лучше всего его добавить? Я не могу манипулировать существующим приложением вне простой перехвата, но я могу перехватить QObject :: connect и сохранить соединения самостоятельно, но не уверен, что это лучший способ сделать это.

Ответы [ 3 ]

29 голосов
/ 03 мая 2010

Я думаю, что Qt хранит слоты, к которым подключен данный сигнал, так что когда вы его излучаете, вызываются все получатели, поэтому вы можете получить доступ к списку получателей:

Для целей отладки у вас есть:

void QObject :: dumpObjectInfo ()

Сбрасывает информацию о сигнале соединения и т. д. для этого объекта вывод отладки.

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

И список слотов, к которым подключен сигнал:

int QObject :: receivers (const char * сигнал) const [защищено]

Возвращает количество получателей. подключен к сигналу.

metaObject () предоставляет вам QMetaMethod для слота, но не имеет информации о его соединениях.

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

9 голосов
/ 07 января 2014

Невозможно безопасно перебрать список соединений с сигнальными слотами, не удерживая внутренние мьютексы / семафоры Qt. Сигналы и слоты могут приходить и уходить в любое время, так что в лучшем случае вы получите список, который не гарантированно будет правильным - и, следовательно, бесполезным.

Что бы вы ни делали в QObject::connect, этого недостаточно. Данные, которые вы получаете от таких хуков, будут страдать от следующего:

  1. У вас могут быть указатели на объекты, которые уже удалены к тому времени, когда вы пытаетесь получить к ним доступ. Вы можете уменьшить это, используя QPointer, но это работает только для объектов, которые живут в потоке, в котором вы выполняете свой код. Вам нужно добавить ваш объект в другие потоки, чтобы собрать там списки объектов.

  2. У вас могут быть соединения, которых больше нет. Даже перехват QObject::disconnect будет недостаточным, так как соединения удаляются, когда объекты перестают существовать.

Проблема, с которой вы сталкиваетесь, довольно сложна, и любое надежное решение не может быть ограничено просто «подключением» QObject::connect.

Увы, вы не сказали почему вам нужен список сигналов, которые прикрепляются к слоту. Какова цель этого?

3 голосов
/ 03 мая 2010

После изучения базы кода Qt и документации (я получил много полезных советов здесь и в других местах), я остановился на перехвате QObject :: connect (статическая перегрузка). Зачем? Что ж, другие решения требуют, чтобы вы знали, какие объекты предоставляют сигналы, копались в приватных полях или должны иметь отладочную сборку Qt. В конце концов, перехват QObject :: connect дает вам все, что связано в приложении, и вы можете тривиально отобразить обратно в слоты.

...