2012-02-17 19 views
16

È difficile per me capire la differenza tra segnali ed eventi in Qt, qualcuno potrebbe spiegare?Quali sono le differenze tra evento e segnale in Qt

+7

Penso che questa sia una vera domanda e non dovrebbe essere chiusa. Ecco una risposta da Qt Community Documentation: un evento in Qt è un oggetto che rappresenta qualcosa di interessante che è successo; la principale differenza tra un evento e un segnale è che gli eventi sono mirati a un oggetto specifico nella nostra applicazione (che decide cosa fare con quell'evento), mentre i segnali vengono emessi "in the wild". Da un punto di vista del codice, tutti gli eventi sono istanze di alcune sottoclassi di QEvent [doc.qt.nokia.com] e tutte le classi derivate da QObject possono sovrascrivere il metodo virtuale QObject :: event() per gestire l'evento. – Dmitriy

+1

Possibile duplicato di [Qt Events e Signal/Slots] (http://stackoverflow.com/questions/3794649/qt-events-and-signal-slots) – Andrea

risposta

4

Gli eventi sono qualcosa che è accaduto a o all'interno di un oggetto. In generale, li tratteresti all'interno del codice di classe dell'oggetto.

I segnali sono emessi da da un oggetto. L'oggetto sta in sostanza notificando ad altri oggetti che qualcosa è successo. Altri oggetti potrebbero fare qualcosa come risultato o meno, ma questo non è compito dell'emettitore occuparsi di esso.

2

Un evento viene passato direttamente a un metodo di gestore di eventi di una classe. Sono disponibili per sovraccaricare le sottoclassi e scegliere come gestire diversamente l'evento. Gli eventi passano anche la catena da bambino a genitore fino a quando qualcuno lo gestisce o cade alla fine.

Segnali d'altra parte sono apertamente emessi e qualsiasi altra entità possono optare per la connessione e ascoltarli. Passano attraverso i loop degli eventi e vengono elaborati in una coda (possono anche essere gestiti direttamente se si trovano nello stesso thread).

9

Un evento è un messaggioincapsulato in una classe (QEvent) che viene elaborato in un ciclo di eventi e inviato a un destinatario che può accettare il messaggio o passarlo insieme ad altri da elaborare. Di solito vengono creati in risposta a eventi di sistema esterni come i clic del mouse.

segnali e slot sono un modo conveniente per QObject s di comunicare tra loro e sono più simili a funzioni di callback. Nella maggior parte dei casi, quando viene emesso un "segnale", qualsiasi funzione di slot ad essa collegata viene chiamata direttamente. L'eccezione è quando i segnali e gli slot attraversano i confini dei thread. In questo caso, il segnale sarà essenzialmente convertito in un evento.

2

La mia impressione della differenza è la seguente:

enter image description here

Diciamo che avete un dispositivo del server, che esegue un ciclo infinito, l'ascolto di alcuni client eventi esterni e di reagire ad essi mediante l'esecuzione di un codice.

(Può essere una CPU, l'ascolto di interruzioni da dispositivi o il codice del browser Javascript lato client, il litsening per i clic dell'utente o il codice sito Web sul lato server, l'ascolto per gli utenti che richiedono pagine Web o dati).

Oppure può essere la tua applicazione Qt, eseguendo il suo ciclo principale.

sarò spiegando con il presupposto che si sta eseguendo Qt su Linux con un server X utilizzato per il disegno.

posso distinguere 2 differenze principali, anche se il secondo è un po 'discutibile:

  1. eventi rappresentano l'hardware e sono un piccolo insieme finito. I segnali rappresentano la logica del tuo livello di widget e possono essere arbitrariamente complessi e numerosi.

Gli eventi sono messaggi di basso livello, venuta a voi dal client. L'insieme di eventi è un insieme strettamente limitato (~ 20 tipi di eventi diversi), determinato dall'hardware (ad esempio clic del mouse/doppio clic/premi/rilascia, spostamento del mouse, tasto della tastiera premuto/rilasciato/tenuto premuto ecc.) E specificato nel protocollo di interazione (es. protocollo X) tra applicazione e utente.

E.g. al momento della creazione del protocollo X non c'erano gesti multitouch, c'erano solo mouse e tastiera, quindi il protocollo X non capirà i tuoi gesti e li invierà all'applicazione, li interpreterà semplicemente come clic del mouse. Pertanto, le estensioni del protocollo X vengono introdotte nel tempo.

Gli eventi X non conoscono nulla dei widget, i widget esistono solo in Qt. Gli eventi X conoscono solo X Window, che sono rettangoli di base costituiti dai widget. Gli eventi Qt sono solo un involucro sottile attorno a eventi X/eventi Windows/eventi Mac, fornendo un livello di compatibilità tra diversi eventi nativi dei sistemi operativi per comodità degli autori di livello logico a livello di widget.

La logica a livello di widget si occupa dei segnali, poiché includono il significato a livello di widget delle azioni. Inoltre, un segnale può essere generato a causa di diversi eventi, ad es. o fare clic con il mouse sul pulsante del menu "Salva" o una scelta rapida da tastiera come Ctrl-S.

  1. In astratto (non si tratta esattamente di Qt!), Gli eventi sono asincroni nella loro natura, mentre i segnali (o gli hook in altri termini) sono sincroni.

Dire, si dispone di una funzione foo(), che può attivare Segnale OPPURE emettere eventi. Se viene emesso un segnale, il segnale viene eseguito nello stesso thread di codice della funzione, che lo ha causato, subito dopo la funzione.

D'altra parte, se emette un evento, L'evento viene inviato al loop principale e dipende dal loop principale, quando invia quell'evento al lato ricevente e cosa succede dopo.

Quindi 2 eventi consecutivi possono anche essere consegnati in ordine inverso, mentre 2 segnali consecutivi sparati rimangono consecutivi.

Tuttavia, la terminologia non è rigorosa. "Singals" in Unix come mezzo di comunicazione tra processi deve essere chiamato meglio Eventi, perché sono asincroni: si chiama un segnale in un processo e non si sa mai, quando il ciclo degli eventi passa al processo di ricezione ed esegue il gestore di segnale .

P.S. Per favore perdonami, se alcuni dei miei esempi non sono assolutamente corretti in termini di lettera. Sono ancora buoni in termini di spirito.

Problemi correlati