2010-05-03 2 views
24

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

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

ответ

3

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

26

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

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

недействительного QObject :: dumpObjectInfo()

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

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

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

ИНТ QObject :: Приемники (Const символ * сигнала) Const [защищенный]

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

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

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

+0

Спасибо за информацию. Есть ли возможность сделать это, не зная объектов? Это действительно проблема, с которой я сталкиваюсь сейчас. –

+6

Вторая часть этого ответа совершенно неверна. –

6

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

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

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

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

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

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