Подтвердить что ты не робот

Определить сигналы, подключенные к данному слоту в Qt

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

void QObject:: dumpObjectInfo()

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

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

И список слотов связан с сигналом:

int QObject:: приемники (const char * сигнал) const [protected]

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

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

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

Ответ 3

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

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

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

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

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

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