Qt4 (0×01)

Kurs Qt4 made by Sinis (0×01) – część druga.

W dzisiejszym odcinku napiszemy program pokazujący komunikat wedle naszych wskazań. Nie będzie to nic wymyślnego, ale skądś trza się uczyć ;)
Podczas tego poznamy podstawy obsługi QtDesignera i mechanizm slotów i sygnałów.
Co będzie nam potrzebne:
- trochę wolnego czasu
- mózg xD
- zainstalowane paczki Qt4 i kompilator G++ (w poprzedniej części kursu było co i jak ;) )
- dobra muzyka

Zacznijmy od odpalenia Designera i wyskrobania jakiegoś okienka dla naszego programu. Po uruchomieniu wybieramy opcję Widget i tworzymy okienko.
Przed oczami mamy pustą formę. W panelu po prawej stronie (Edytor właściwości) zmieniamy nazwę obiektu na Msger, lub dowolną inną, zjeżdżamy trochę na dół i zmieniamy tytuł okna na np. ‘Msger – kurs Qt4 made by Sinis (0×01)’ ;)
Teraz wrzućmy coś na naszą foremkę. Będziemy potrzebować:
- dwóch labeli (nazwy obiektów dowolne)
- dwóch lineeditów (title i text)
- dwóch pushbuttonów. (show i quit)
Obiekty te wystarczy przycisnąć na liście, przeciągnąć i puścić na formie. Potem tylko nadać odpowiednie nazwy obiektom i teksty etykietom.
Po wszystkim formatka powinna wyglądać +/- tak:

Formatkę zapisujemy w folderze z projektem (zapisałem pod nazwą msger.ui w katalogu msger).

Teraz przechodzimy do niewątpliwie ciekawszej kwestii – kodzimy :D Zróbmy tak: ja podam kod, potem go ładnie wytłumaczę, w razie pytań wiadomo co ;)
Tworzymy w katalogu z projektem plik main.cpp. Plik ten powinien mieć +/- taką oto zawartość:

//main.cpp
#include <QApplication>
#include “msger.cpp”

int main(int argc, char* argv[])
{
QApplication app(argc, argv);
Msger msger;
msger.show();
return app.exec();
}

Tutaj nic strasznego nie ma. Tworzony jest obiekt klasy QApplication (może być tylko jeden na całą aplikację i można do niego uzyskać dostęp przez makro qApp). Potem tworzony i pokazywany jest formularz. Na końcu program przechodzi w pętlę obsługi zdarzeń.

// msger.h
#ifndef _MSGER_H_
#define _MSGER_H_

#include “ui_msger.h”

class Msger: public QWidget
{
Q_OBJECT

public:
Msger();
~Msger() {}

public slots:
void showMsg();

private:
Ui::Msger ui;
};

#endif // _MSGER_H_

Na wstępie includujemy tajemniczy pliczek ui_msger.h. Jest to plik tworzony przez program dołączony do biblioteki qt4, który automatycznie przerabia nasze formy na pliki ui_.h. Wszystko zawarte w tym pliku jest w przestrzeni nazw Ui.
Następnie tworzymy klasę Msger dziedziczącą po QWidget. Makro Q_OBJECT oznacza, że nasza klasa korzysta z mechanizmu slotów i sygnałów. Jest to puste makro i nie czyni g++’owi żadnych problemów ;)
A teraz kolejne cudo:
public slots:
void showMsg();
Słowo slots również jest pustym makrem i nie czyni G++owi problemów. Owe symbole służą narzędziom biblioteki qt4 do kompilacji naszego kodu. W ten oto sposób kompilator qt4 dodaje wpisik, iż istnieje funkcja showMsg() będąca slotem klasy Msger.
W sekcji prywatnej tworzymy obiekt ui zawierający interfejs użytkownika, który ‘narysowaliśmy’ w designerze.

// msger.cpp
#ifndef _MSGER_CPP_
#define _MSGER_CPP_

#include <QTextCodec>
#include <QMessageBox>
#include “msger.h”

Msger::Msger()
{
ui.setupUi(this);
setFixedSize(400, 88);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName(“ISO-8859-2″));

connect(ui.quit, SIGNAL(clicked()), qApp, SLOT(quit()));
connect(ui.show, SIGNAL(clicked()), this, SLOT(showMsg()));
}

void Msger::showMsg()
{
// Sprawdza czy pola title i text zostały wypełnione i pokazuje komunikat.

if (ui.title->text().isEmpty())
{
QMessageBox::critical(this, “Błąd!”, “No jak to tak nie podać tytułu…”);
return;
}
if (ui.text->text().isEmpty())
{
QMessageBox::critical(this, “Błąd!”, “A treść komunikatu to listonosz zabrał?”);
return;
}

// Jakeśmy tu doszli to można pokazać komunikat
QMessageBox::information(this, ui.title->text(), ui.text->text());
}

#endif // _MSGER_CPP_

W konstruktorze na wstępie nakładamy design wcześniej utworzonego pliku msger.ui na naszą klasę, ustawiamy fixedSize, czyli stały rozmiar okna.
Potem ustawiamy kodowanie znaków. W moim przypadku, pod CodeBlocksem jest to ISO-8859-2.
A teraz gwóźć programu – sloty i sygnały. Działa to na takiej zasadzie, iż po naciśnięciu jakiegoś przycisku, lub wykonaniu innej akcji generowany jest sygnał, który odbiera pętla zdarzeń aplikacji i szuka czy jest jakiś slot związany z tym sygnałem nadanym z tego obiektu. Jeśli tak to uruchamia tenże slot. Prototyp funkcji connect() wygląda tak:
connect(QObject* sender, char* signal, QObject* receiver, char* slot);
sender – obiekt nadający sygnał,
signal – typ sygnału (przekształcany przez makro SIGNAL())
receiver – obiekt, który ma odebrać sygnał
slot – slot, który zostanie wykonany po odebraniu sygnału (przekształcany przez makro SLOT()).

Funkcja showMsg() problemów czynić nie powinna ;)

Kompilacja:
qmake -project
qmake
make
I możemy cieszyć oczy naszym tworem.

To by było dzisiaj na tyle. Kod programu można pobrać z http://sinis.yoyo.pl/pub/msger.zip.

Pozdrawiam
Sinis

Napisz komentarz