2010-09-20 14 views
14

Czy istnieje sposób sprawdzenia, które sygnały są uruchamiane i czy jest do nich podłączone gniazdo? Idealnie, chcielibyśmy zobaczyć sygnały, nie tylko te z konkretnej klasy lub metody; na przykład QSignalSpy pozwala nam tylko śledzić określone sygnały konkretnych wystąpień.Debuguj sygnały Qt, gniazda i połączenia

W naszej aplikacji zaobserwowaliśmy problemy z wydajnością, ponieważ sygnał jest emitowany dwa razy z różnych komponentów. W końcu okazało się, że istnieje druga instancja klasy, która powinna być tam tylko raz. Wiedząc, które sygnały są emitowane, pomaga to w debugowaniu.

Sygnały są wywoływane przez QMetaObject::invoke*, miałem nadzieję, że znajdę tam coś, do czego można się podłączyć, ale nie znalazłem nic oczywistego.

+0

możliwy duplikat [Jak przechwycić WSZYSTKIE sygnały emitowane przez daną imprezę w QT?] (Http://stackoverflow.com/questions/2072013/how-to-intercept-all-signals-emitted-bya-a- given-event-in-qt) – exilit

+0

Jeśli chcesz mieć tylko jedną instancję klasy, dlaczego nie użyłeś wzorca singleton do kontrolowania liczby obiektów? – Afshin

Odpowiedz

1

QSignalSpy może pomóc.

Od docs,

Klasa QSignalSpy umożliwia introspekcji sygnału emission.QSignalSpy można podłączyć do dowolnego sygnału z dowolnego obiektu i rejestruje jego emisji.

Docs ma przykłady zbyt ..

+1

Mam świadomość szpiega sygnałowego, przepraszam, że o tym nie wspomniałem. Wadą tego jest to, że nie pozwala mi zobaczyć * wszystkie * emitowane sygnały, tylko specyficzne sygnatury sygnałowe jednej klasy lub instancji. – Ivo

+0

@Ivo, nie jestem pewien, czy jest coś, co wymienia wszystkie wysyłane sygnały, ale tak "QSignalMapper" jest śledzenie sygnałów z określonej instancji. – liaK

+0

Qt utrzymuje wewnętrznie listę sygnałów, która jest strukturą zawierającą co najmniej ciąg zawierający nazwę sygnału i podpis. Tyle się dowiedziałem od spojrzenia na kod. Niestety, niestety jest to głęboko zakopane w Qt. – Ivo

5

(Zastrzeżenie, pracuję dla KDAB): KDAB na GammaRay tool może pokazać obiekty i połączenia w czasie wykonywania, bez konieczności jakichkolwiek zmian źródła. Sprawdza tabele metaobiektów i wykonuje pewne haki do wprowadzania kodu, aby to działało.

+1

Zbudowałem GammaRay z repozytorium git i nie mogłem znaleźć miejsca połączeń (zbudowane z Qt 5.7); panel Sygnały pokazał tylko tiki emisji. Najlepsze, co mogłem zrobić, to wyjąć sprawdzanie dla QT_DEBUG w qobject.cpp i wywołać dumpObjectInfo(), aby zobaczyć wszystkie połączenia sygnału/szczeliny obiektu, w przeciwnym razie nic nie wydrukowało dla mojej skonfigurowanej Qt -debug-and-release konfiguracji . –

Powiązane problemy