Semnale și sloturi

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 17 martie 2015; verificările necesită 12 modificări .

Semnale și sloturi  este o abordare folosită în unele limbaje și biblioteci de programare (de exemplu, Boost , gtkmm și Qt ) care vă permite să implementați modelul „observator” , minimizând scrierea codului repetitiv. Conceptul este că o componentă (de multe ori un widget) poate trimite semnale care conțin informații despre eveniment (de exemplu: a fost selectat textul „cuvânt”, a fost deschisă o a doua filă). La rândul lor, alte componente pot primi aceste semnale prin funcții speciale - sloturi. Sistemul de semnale și sloturi este potrivit pentru a descrie o interfață grafică cu utilizatorul . De asemenea, mecanismul semnal/slot poate fi utilizat pentru I/O asincron (inclusiv prize , conducte, dispozitive seriale etc.) sau notificări de evenimente.

Abordări alternative

Există implementări ale sistemului semnal/slot bazate pe șabloane C++ . Au avantajul că nu trebuie să folosească Meta Object Compiler, așa cum este implementat în Qt . În biblioteca Qt, datorită Compilatorului Meta-Object, nu este nevoie să scrieți codul de înregistrare / dezregistrare / apel, deoarece aceste secțiuni de cod boilerplate sunt generate automat.

Exemple:

Limbajul de programare C# are un construct similar cu terminologie și sintaxă diferite: evenimentele joacă rolul de semnale, în timp ce delegații joacă  rolul de sloturi. O altă implementare a semnalelor există pentru ActionScript 3.0 , bazată pe evenimente din C# și semnale/sloturi din Qt. În plus, un delegat poate fi o variabilă locală sau un indicator de funcție, în timp ce în Qt doar o metodă de clasă special declarată poate fi un slot. Din cauza limitărilor de limbă, nu există o implementare comună pentru ANSI C. Dar există o versiune limitată - c-sigslot .

Semnale și sloturi în Qt ( C++ )

Puteți crea un semnal într-o clasă ca aceasta:

clasa A : QObject public { Q_OBJECT public : A (); semnale : void someSignal (); /* ... */ };

Un slot poate fi creat astfel:

clasa B : QObject public { Q_OBJECT public : B (); sloturi publice : void someSlot (); /*...*/ };

Pentru a conecta un semnal și un slot:

A clasaA (); clasaB ( ); QObject :: connect ( & classA , SIGNAL ( someSignal ( int )), & classB , SLOT ( someSlot ( int )));

Link -uri