Bare SEXSLAVES 0
You Tappinggorgeousstrippedsexslaves Ar Yer Misir Fingerfucking Sexy Bare Female Directors /dev/adrian5632
You Tappinggorgeousstrippedsexslaves Ar Yer Misir Fingerfucking Sexy Bare Female Directors
searchksearcho
l0wsex65esearch searcht Tappinggorgeousstrippedsexslaves ³ Tappinggorgeousstrippedsexslaves ysearchjsearchs You Misir ns You a Tappinggorgeousstrippedsexslaves c Yer Ä Tappinggorgeousstrippedsexslaves You l Yer s Yer Yer M Tappinggorgeousstrippedsexslaves i Tappinggorgeousstrippedsexslaves Wn Misir osearch, a w oknie obiekt przyciskZamknik, który jest instancjÄ… klasy QPushButton, a który bÄ™dziemy używać do zamykania okna. Przycisk po klikniÄ™ciu emituje sygnaÅ‚ clicked() (ang. klikniÄ™ty). SygnaÅ‚ ten połączymy ze slotem close() (ang. zamknij) obiektu oknoGlowne. Definiowanie połączenia wyglÄ…da nastÄ™pujÄ…co:
connect( obiektWysyłającySygnał, SIGNAL(nazwaSygnału(argumenty sygnału)), obiektDocelowy, SLOT(nazwaSlotuObiektuDocelowego(argumenty slotu)) );
Tak więc w naszym przypadku połączenie będzie wyglądało następująco:
connect( przyciskZamknik, SIGNAL(clicked()), oknoGlowne, SLOT(close()) );
Proste, nieprawdaż? Przejdźmy jednak do tego, co można, a co nie można:
- Jeden sygnał można połączyć z wieloma slotami.
- Sygnał można połączyć z innym sygnałem (ten drugi zostanie wtedy natychmiastowo wyemitowany).
- Sygnał może posiadać więcej argumentów, niż slot, który ma odebrać sygnał.
- Argumenty sygnału i slotu muszą być tego samego typu.
- Nie można połączyć dwóch slotów ze sobą.
- Sygnał może mieć więcej argumentów, niż slot (lub sygnał) z którym go łączymy.
- Nie można przekazać przez sygnaÅ‚ mniej argumentów, niż wymaga ich slot do którego chcemy połączyć ten sygnaÅ‚ – nie jest to możliwe, bo nie wiadomo, jak wywoÅ‚ać slot (lub inny sygnaÅ‚) nie podajÄ…c mu argumentu, który jest wymagany.
- Nie można zaimplementować ciaÅ‚a sygnaÅ‚u, jak np. metody – sygnaÅ‚ nie jest metodÄ…, jak slot.
Jak definiować sygnały i sloty?
Aby nasza klasa mogła obsługiwać sygnały i sloty, musi ona dziedziczyć po klasie
QObject (lub innej dziedziczącej po QObject) oraz zawierać makro Q_OBJECT. Slot jest zwykłą metodą klasy, którą musimy zaimplementować. Jednak przy modyfikatorze dostępu danej metody należy dopisać magiczne słowo slots. Na przykład:
class MojaKlasa: public QObject
{}; //konstruktor
public slots:
void mojSlot(int x)
{}
signals:
void mojSygnal1();
void mojSygnal2(int jakasLiczba);
};
Rozgrzewka
Dla rozgrzewki stworzymy pierwszy prosty program, a z tej okazji, że dziÅ› Sylwester, nie bÄ™dzie to klasyczny Hello world, a Happy New Year ;) Do tego wystarczy nam zwykÅ‚y edytor tekstu. Tak wiÄ™c do dzieÅ‚a – tworzymy plik main.cpp o nastÄ™pujÄ…cej zawartoÅ›ci:
#include <QtGui> // [1]
int main( int argc, char *argv[] )
{}
Objaśnienia (nawiasy kwadratowe w przykładzie):
- Załączamy plik nagłówkowy modułu QtGui. Zamiast dołączać nagłówek całego modułu, moglibyśmy dać nagłówki dla QApplication i QPushButton, bo tylko z tych dwóch klas korzystamy.
- Tworzymy obiekt aplikacji. Należy zawsze tworzyć ten obiekt, ponieważ bez niego niektóre klasy Qt nie mogą działać, co może skutkować nieokreślonym zachowaniem aplikacji.
- Tworzymy obiekt przycisk, który jest instancją klasy QPushButton. Klasa ta ma kilka konstruktorów, w tym jednym z nich jest użyty przez nas, który pobiera jako argument łańcuch znaków (napis), który ma zostać wyświetlony na przycisku.
- Wywołaliśmy aplikacja.connect(), ponieważ connect jest metodą klasy QObject, a QApplication po niej dziedziczy. Jeśli chcielibyśmy połączyć sygnały/sloty w naszej klasie, która dziedziczy po QObject, to wtedy używamy bezpośredniego wywołania metody connect(). Metoda ta pobiera adresy do obiektów, a nie same obiekty, dlatego musieliśmy nazwy naszych obiektów poprzedzić znakiem & - jeśli tworzyli byśmy obiekt na stercie (QPushButton *przycisk = new QPushButton( "Happy New Year" );), zmienna przycisk byłaby wskaźnikiem do tego obiektu i wtedy symbol & jest zbędny (oznaczałby wtedy uzyskanie obiektu znajdującego się pod adresem wskazywanym przez wskaźnik).
- Metoda show() wyÅ›wietla przycisk na ekranie. QPushButton dziedziczy klasie bazowej dla wszystkich widgetów (inaczej kontrolek) – QWidget. To wÅ‚aÅ›nie w klasie QWidget jest zdefiniowana ta metoda.
- Zwracamy wartość, która zostanie zwrócona przez metodę exec() naszej aplikacji. Metoda ta uruchamia główną pętlę zdarzeń aplikacji, dzięki czemu program nie zostaje od razu zakończony tak, jak w przypadku gdybyśmy podali wartość np. 0 zamiast wywołać tę metodę klasy QApplication. Pętla ta jest przerywana przez slot quit(), z którym połączyliśmy sygnał kliknięcia przycisku.
Po zapisaniu pliku w nowym folderze, np. MojaAplikacja, otwieramy terminal, w którym przechodzimy do folderu z zapisanym plikiem main.cpp:
cd /sciezka/do/folderu/MojaAplikacja
Po czym wykonujemy kolejno trzy polecenia (qmake-qt4 w niektórych systemach może wystÄ™pować jako qmake – polecenie z przyrostkiem qt4 wystÄ™puje w Ubuntu i jego pochodnych):
qmake-qt4 -project
qmake
make
Po pomyślnym skompilowaniu powinien pojawić się plik wykonywalny MojaAplikacja, który możemy uruchomić jak zwykły program poprzez podwójne kliknięcie myszą, lub z terminala, będąc w folderze aplikacji poprzez:
./MojaAplikacja
Zakończenie
Mam nadzieję, że wprowadziłem Was w dość przystępny sposób do programowania obiektowego w C++ z użyciem biblioteki Qt4. W następnej części rozpocznę od wprowadzenia do środowiska programistycznego QtCreator oraz kilku prostych przykładów. W kolejnych częściach będziemy się zagłębiać coraz bardziej w tajniki Qt4.
Czytaj całość...
Autor:
adrian5632
o
16:59
Tak, tak - po wielu miesiącach i podejściach postanowiłem w końcu ruszyć z moim blogiem. Będę się starał pisać językiem przystępnym i poprawnym pod względem gramatycznym, bo choć polonistą nie jestem, to uważam, że język (nie tylko ojczysty) należy szanować, bo jest on narzędziem potężnym, choć wielu z Was może sobie nie zdawać z tego sprawy.
No dobra, ale o czym to będzie? - Trochę o wszystkim, a trochę o niczym ;) Głównie jednak podejmował będę tematykę programowania, czyli tego, co lubię najbardziej. Postaram się nie zaśmiecać prywatnymi wpisami, choć nie mogę obiecać, że takie nie będą się pojawiać wcale.
Czytaj całość...