2012-01-03 7 views
8

Controllare lo slot del segnale Qt per connettere le chiamate in fase di runtime è una preoccupazione per me. Dovrei essere in grado di eseguire un controllo statico delle istruzioni di connessione.Come posso verificare i collegamenti segnale/slot durante la compilazione?

Esiste un tale strumento?

+4

Questo strumento è Qt 5: http://woboq.com/blog/new-signals-slots-syntax-in-qt5.html :) – mlvljr

+1

@mlvljr Ho letto che un paio di settimane fa, è fantastico, tuttavia ho un sacco di codice da modificare per ottenere il vantaggio. –

risposta

3

Usando QT5 è possibile utilizzare la seguente sintassi che viene controllata in modo statico in fase di compilazione:

connect(sender, &Sender::signalMethod, receiver, &Receiver::slotMethod); 
3

Esiste un tale strumento?

Sarebbe bello se tale strumento esistesse, ma sfortunatamente non esiste, a causa del modo in cui il meccanismo segnale/slot è implementato in qt. Inoltre, per questo motivo non è possibile controllare staticamente se il segnale entra nello slot.

Se qt utilizzava qualcosa come il segnale/gli slot di boost, sarebbe possibile.

+0

Potresti spiegare perché non sarebbe possibile? Con un albero dei sorgenti completo non vedo perché non dovrei essere in grado di confrontare segnali e slot. Certo, ho bisogno di cercare in più di un file alla volta, ma dovrebbe essere ancora possibile. –

+0

@PhilHannent [Questa pagina] (http://developer.qt.nokia.com/doc/qt-4.8/signalsandslots.html) descrive i segnali/slot di QT. È possibile raggiungere alcuni limiti (ad esempio, firme errate in SIGNAL e SLOT).Certo, puoi scrivere il tuo strumento che lo fa, ma l'attuale implementazione di QT non lo fa. –

2

Si potrebbe pensare di creare un plug-in GCC in C o un'estensione MELT, MELT è un linguaggio specifico del dominio per codificare facilmente le estensioni GCC. Con estensioni MELT o plugin, è possibile analizzare le rappresentazioni interne (in particolare Tree-s che rappresentano le dichiarazioni delle funzioni C++ della classe &) e creare uno strumento specifico per questo.

Tuttavia, l'estensione di GCC richiede di comprendere la sua rappresentazione interna piuttosto complessa e richiederebbe più di una settimana di sforzi per una persona che non conosce gli interni GCC.

Forse un tale sforzo non vale la pena, a meno che la tua applicazione Qt sia davvero grande. Se consideri di lavorare con MELT su questo, sarei lieto di aiutarti.

1

Non è possibile controllare questo in fase di compilazione, ma se si esegue il programma in modalità di debug in Qt Creator, verrà stampato un messaggio diagnostico utile nel riquadro Applicazione fuori linea se una chiamata connect ha esito negativo. Vedi my answer here.

+0

Non intendevo letteralmente in fase di compilazione, proprio come parte degli strumenti che vengono eseguiti (qmake, nmake/make, cppcheck, ecc.). Ho i messaggi dell'applicazione in uscita, tuttavia se hai creato dinamicamente oggetti è molto più difficile da testare perché devi assicurarti di creare almeno uno di questi oggetti ogni volta che fai test di accettazione. –

2

Ho usato qualcosa di simile nel mio codice:

#define CONNECT_OR_DIE(source, signal, receiver, slot,connection_type) \ 
    if(!connect(source, signal, receiver, slot,connection_type)) \ 
     qt_assert_x(Q_FUNC_INFO, "CONNECT failed!!", __FILE__, __LINE__); 

ho usato al posto del semplice chiamata per la connessione(). Ti aiuta ??

+2

Questo è runtime, non tempo di compilazione. -1 – weberc2

+0

@ weberc2 conosci una soluzione di compilazione? pubblicalo. Hai letto i post? – UmNyobe

+1

@UmNyobe Sì, ho letto i post. Hai letto la domanda? ;) E no, non so di una soluzione a tempo di compilazione (questa è la ragione per cui ho letto la tua risposta!). :) – weberc2

1

Per lavorare con grandi Qt4 base di codice che ho scritto come correttore come plug per clang static analyzer

See: http://reviews.llvm.org/D14592

esempio di esso copertura dei test:

connect(&send, SIGNAL(f2(int, double*)), &recv, SLOT(bugaga(int, double*))); // expected-warning{{Can not find such slot}}