Qt - Сигнали и слотови
Кога вашата апликација функционира, таа го извршува она што сте го дефинирале во кодот на програмата. На пример, кога ќе се притисне некое копче, нека се пресмета збир на два броја. Кога ќе се помине врз површината на некој објект да се појави текст со совет за дадениот објект (што е тој и што со него) и слично. Како комуницираат објектите во GUI средината на Qt? Покрај тоа што Qt е настански-придвижена средина (event-driven) исто така постојат и Сигналите и Слотовите (eng. Signals and Slots).
Што се Сигналите и Слотовите
Ни кажува самото име, сигнали кои можат да бидат испратени до некаде. Слотовите пак, се делови од кодот кои ги примаат сигналите и врз основа на тоа што им е испратено, реагираат соодветно. Така кога го испраќаме сигналот „ПоминиВрз“ кон некој објект, можеме да го активираме сигналот „ПокажиСовет“., За да испратиме сигнал кон слот, треба да дефинираме кој е сигналнот преку неговото име и слотот што треба да се активира по примањето на сигналот исто така преку неговото име. Покрај стандардните слотови дефинирани во стандардните вклучни датотеки на Qt, можат да се создаваат и сопствени слотови, т.е. вие да си напишете слот според вашите потреби.
Начин на поврзување
Веќе ја споменав една од најупотребуваните класи во Qt – QObject. Во неа постои еден метод, кој враќа логичка вредност TRUE/FALSE (0/1), и со помош на која настанува секое поврзување помеѓу сигналите и слотовите. Општата синтакса е:
bool QObject::connect ( sender, signal, this, slot ) const
Гледаме дека дефинирани се стандардно четири формални параметри. Првите два се одредени за да се дефинира Испраќачот и сигналот што тој го испраќа. Значи кој и што испраќа се дефинира тука. Следните два се покажувачот this и Примачот на сигналот. На пример, сакаме дадено копче да ја затвора апликацијата, во кодот ја ставаме следнава линија:
connect( object_name, SIGNAL(clicked() ), this, SLOT(quit()) );
Со connect(…), му даваме на преведувачот до знаење дека тоа што е во заграда треба некако да се поврзи. Во случајот објектот со име, object_name, кој може да е било кој објект што може како сигнал да испрати clicked(). Тоа значи дека врз тој објект е притиснато со глувчето или преку тастатурата. Пример, да дефинираме објект од класа QPushButton, на него да пишува „Quit“, и по притискањето целата апликација да се исклучи. Објекти од класа QPushButton, можат како сигнал да испратат clicked(). Покрај тој сигнал, други можe да се и pressed(), toggled(), stateChanged() и released(), сигнали кои ќе ги разгледаме другпат.
Пример
Да напишеме програма преку која на екранот ќе се појави Прозорец, на него да има копче на кое ќе пишува Quit на кое по кликањето, главниот прозорец ќе биде затворен. Во нашиот пример ќе употребиме три вклучни датотеки, qapplication.h, qpushbutton.h и qfont.h. QFont, e класа дефинирана во qfont.h, која нуди голем број методи за манипулација со фонтови. Нас ќе ни треба за да го поставиме фонтот видлив на копчето. Еве го кодот на она што го опишав:
#include “qapplication.h” #include “qpushbutton.h” #include “qfont.h”
int main( int argc, char **argv ) { QApplication a( argc, argv ); QPushButton quit( “Quit”, 0 );
quit.resize( 75, 30 ); quit.setFont( QFont( “Times”, 18, QFont::Bold ) );
QObject::connect( &quit, SIGNAL(clicked()), &a, SLOT(quit()) );
a.setMainWidget( &quit ); quit.show();
return a.exec(); }
Образложение
Во 4 ред следува дефиницијата на главната main() функција, која исто како и во претходниот пример, прима два основни параметри. Декларираме објект ‘а’ (6) од класата QАpplication, потоа копчето со име quit, и на кое ќе пишува Quit (линија 7) и ‘0′ како параметар кој го става копчето quit, во рамките на целиот главен прозорец. Во 9 ред, нема ништо ново, во 9 е дефинирањето на фонтот за објектот (копчето) quit, на следиот начин: му кажува на преведувачот, да стави фонт од фамилијата “Times”, со големина 18 и да биде Bold. Значи конструкторот на класата QFont прима три параметри, фамилија на фонтот, големина и променлива од класата QFont, со име Bold. Во 11 ред, од класата QОbject, го користиме connect(…). Гледаме дека не е ништо тешко, само што до копчето се пристапува преку Референца, и се користи покажувачот this. Најпросто кажано: „Кога ќе кликнам на копчето Quit, повикај го слотот quit() со што ќе го исклучиш дијалогот“.
Следните редови се веќе познати. Кога ќе го преведеме кодот, (преведувањето оди по ист принцип како во претходните примери), добиваме прозорец со копче Quit (тоа што ни требаше) и по кликањето на тоа копче, програмата се исклучува, без ништо да се врати кон главната функција (впрочем close() е близок со друг слот – hide()). Ако наместо quit(), беше accept(), тогаш при притискање на копчето Quit, кон главната функција ќе се вратеше 1 (TRUE), и дијалогот исто така ќе се исклучеше.