Отладка сигналов, слотов и соединений Qt

Есть ли способ узнать, какие сигналы срабатывают и подключен ли к ним слот? В идеале мы хотели бы видеть все сигналы, а не только сигналы определенного класса или метода; например QSignalSpy позволяет нам отслеживать только определенные сигналы определенных экземпляров.

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

Сигналы вызываются через QMetaObject::invoke*, я надеялся найти там что-нибудь, чтобы зацепиться, но ничего очевидного не нашел.


person Ivo    schedule 20.09.2010    source источник
comment
возможный дубликат Как перехватывать ВСЕ сигналы генерируется данным событием в QT?   -  person exilit    schedule 16.10.2014
comment
Если вы хотите иметь только один экземпляр класса, почему вы не использовали шаблон singleton для управления количеством объектов?   -  person Afshin    schedule 07.05.2016


Ответы (2)


(отказ от ответственности, я работаю в KDAB): инструмент GammaRay KDAB может отображать объекты и соединения во время выполнения, не требуя каких-либо изменений источника. Он проверяет таблицы метаобъектов и выполняет некоторые перехватчики кода, чтобы заставить эту работу работать.

person James Turner    schedule 08.06.2016
comment
Я построил GammaRay из репозитория git и не смог найти, где отображаются соединения (построено с помощью Qt 5.7); панель «Сигналы» только что показывала тики излучения. Лучшее, что я мог сделать в качестве альтернативы, - это удалить проверку QT_DEBUG в qobject.cpp и вызвать dumpObjectInfo (), чтобы увидеть все соединения сигнала / слота объекта, иначе он ничего не напечатал для моей сборки Qt, настроенной с помощью -debug-and-release . - person remikz; 08.01.2017

Вам может помочь QSignalSpy.

Из документов,

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

В документации тоже есть примеры ..

person liaK    schedule 20.09.2010
comment
Я знаю о шпионах сигналов, извините, что не упомянул об этом. Обратной стороной этого является то, что он не позволяет мне видеть все излучаемые сигналы, а только определенные сигнатуры сигналов одного класса или экземпляра. - person Ivo; 20.09.2010
comment
@Ivo, я не уверен, есть ли что-нибудь, в котором перечислены все испускаемые сигналы, но да, QSignalMapper - это отслеживание сигналов от указанного экземпляра .. - person liaK; 20.09.2010
comment
Qt поддерживает список сигналов внутри, который представляет собой структуру, содержащую по крайней мере строку, содержащую имя сигнала и подпись. Это я понял, посмотрев на код. Однако, к сожалению, это очень глубоко похоронено в Qt. - person Ivo; 20.09.2010