Регистрация подключений в очереди

Я использую сложную систему движка состояний с Qt 5.4 (используя пользовательские классы движка состояний).

Частью этого кода является регистрация событий, переходов и т. Д. Для меня очень важно регистрировать все события, которые получает обработчик / объекты состояния, чтобы я мог полностью отслеживать, что происходит в обработчиках состояний.

Для большинства типов событий регистрация очень проста. Однако я не смог войти в очередь подключений (т. Е. События мета-вызова). QMetaCallEvent является приватным, поэтому я ничего не могу сделать. Однако трудно поверить, что такая неотъемлемая часть Qt не может быть должным образом проверена.

Есть ли какой-то способ, который я пропустил, который позволяет регистрировать соединения в очереди (включая имя сигнала, имя слота, имя отправителя, имя получателя и аргументы, если это возможно)?

2 ответа

Решение

Нет официального API, позволяющего делать то, что я намерен.

Проверка событий QMetaCall (с использованием частных заголовков фреймворка) - плохая идея. Во-первых, они являются частными (и могут в любой момент нарушить ваш код), во-вторых, указатель отправителя события QMetaCall может быть недействительным, если отправитель был удален немедленно, и я не смог найти чистый способ проверки событий в таких случаях.

То, как я сейчас пользуюсь, совершенно другое. Вместо проверки поступающих объектов событий я использую модифицированный вариант QSignalSpy, который позволяет делать больше, чем исходный класс, и помогает регистрировать излучение сигнала с использованием вторичных соединений.

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

Установите фильтр событий и перехватывайте события с помощью ev->type() == QEvent::MetaCall. Все участники видны в отладчике.

Нужен доступ к частным заголовкам? Используйте QT += core-private в вашем.pro-файле.

(tone mode = "original poster") Трудно поверить, что никто не читает документацию (/tone)

Другие вопросы по тегам