Jak do tej pory tworzone przez nas aplikacje miały raczej charakter małych programików lub raczej części składowych jakiegoś większego programu. Wszystkie okienka i formatki były budowane przy użyciu klasy QDialog co ma pewne ograniczenia: nie pozwala na tworzenie menu. Dlatego też teraz do stworzenia okienka wykorzystamy klasę QMainWindow.
Po uruchomieniu Qt Designera i stworzeniu projektu np. o nazwie menus.pro wybieramy "File->New", a następnie Main Window. Spowoduje to uruchomienie dość dziwnego kreatora, który automatycznie utworzy nam edytor tekstu. W omawianym przykładzie wykonamy Menu własnoręcznie dlatego też proponuję zamknąć kreatora za pomocą przycisku Cancel. Następnie zapisujemy wszystko.
Teraz trochę klikologii:
Klikamy prawym przyciskiem myszy na formie i wybieramy Add Menu Item:
Zmienimy teraz nazwę pierwszego menu, nadamy mu niezwykle oryginalną nazwę plik. Aby tego dokonać należy dwukrotnie kliknąć na napis "Menu" i zacząć pisać. Zatwierdzamy enterem. Po zatwierdzeniu menu powinno już działać - przynajmniej w fazie projektowania. Możemy teraz dwukrotnie kilknąć na napis new item i wpisać np. zakończ. Będzie to pierwsza opcja jaką damy użytkownikowi programu. Dodanie nowego pola menu zatwierdzamy enterem.
Dodanie akcji
Jak zapewne niektórzy z was zauważyli po utworzeniu okna QMainWidget pojawiło się nam nowe okienko ActionEditor. Każdy element końcowy naszego menu będzie tu widoczny jako akcja. (Dobrym pomysłem będzie w tym miejscu zmiana nazw, akcji na pozbawione polskich krzaczków.) Za pomocą znanego już nam przycisku (tu czerwona strzałka), który wywoła okienko z połączeniami (connections) dodamy do naszego menusa akcję. Proponuję na sam początek przypisać funkcję, która bez żadnego "ale" zamknie nasz program. W okienku połączeń wybierzemy sygnał activated() i slota close().

Dodajemy plik main.cpp i możemy kompilować (qmake -> make).
Za pomocą opisanych powyżej metod i kodu z lekcji 5 możemy w prosty sposób utworzyc edytor tekstu. W tym celu upuszczamy na formę pole textEdit (i zmienimy nazwe na teEdytor) oraz dodamy do menu Plik opcje otwórz, zapisz i np. nowy. Utworzymy również menu edycja i tu wstawimy: wytnij, kopiuj, wklej i wstaw date. Aby program wygladał jakoś po ludzku dodamy również menu pomoc z opcją o programie. Jeśli wszystkie akcje w edytorze akcji mają poprawne (bez polskich znaków) nazwy to przechodzimy dalej.
Po pierwsze dodamy pliki nagłówkowe: qfiledialog.h, qmessagebox.h oraz qdatetime.h. Następnie przejdziemy do pisania kodu. Pierwszą akcją jaką mamy w menu plik powinien być nowy. Normalnie funkcja ta tworzy nowy projekt/plik w pamięci, pod warunkiem, że zawartość pola edycyjnego nie zmieniła się. Tak więc musimy to sprawdzić:
void Form2::nowy() { if ( teEdytor->isModified() && (QMessageBox::question( this, "Informacja", "Plik zostal zmieniony. Czy chcesz zapisac ??", "&Tak", "&Nie",
QString::null, 0, 1 )) == 1 ) { teEdytor->setText( "" ); teEdytor->setModified(FALSE); } } Akcje (sygnały) otwórz i zapisz proponuję skopiować z lekcji czwartej, aby się za dużo nie mędzyć. Dobrym pomysłem byłoby dodanie sprawdzania czy zawartość pola edycyjnego się zmieniła od czasu zapisania, otworzenia lub utworzenia nowego pliku. Ma to olbrzymie znaczenie gdyż jeśli tego nie zrobimy nasz biedny użytkownik może przez przypadek skasować sobie cały dzień pracy. Nie będę tutaj opisywał tego z punktu widzenia kodu. Napiszę tylko krótki algorytm działania naszego programu.
1. Użytkownik otwiera (lub tworzy nowy) plik. 2. W polu edycyjnym dokonuje jakichś zmian. 3. Program pyta się czy zapisać zmiany zanim wykona cokolwiek. 4. Jeśli user odpowie, że chce to program zapisuje zawartośc pola i wykona wskazaną operację. 5. Jeśli user odpowie, że nie chce to program skasuje zmiany wykonując wybraną operację. 6. Po wszystkim ustawimy wskaźnik modyfikacji pola na FALSE
Zabieramy się za menu edycja. Na początek najprostsze: dzisiejsza data:
void Form2::date() { QDate date = QDate::currentDate(); QString aDzis = date.toString ( Qt::LocalDate ); teEdytor->append( aDzis ); } oczywiście, żeby kod zadziałał musimy tego slota podczepić do sygnału kliked pozycji wstaw datę w menu. Dodanie obsługi copy/paste jest jeszcze prostsze ale polega na wykonaniu czegoś czego jeszcze nie robiliśmy. Chodzi o to, że do tej pory odbiorcą wszystkich sygnałów w naszych programikach była formartka, tym razem odbiorcą będzie edytor. Okienko ze slotami powinno więc wyglądać mniej więcej tak:
Na koniec jeszcze dodamy obsługę about. Wstawimy tam, krótkiego messageboxa o autorze programu: void Form2::about() { QMessageBox::information( this, "Informacja", "Autorem programu jestem ja GREAT LINUX PROGRAMMER :)", "&OK", QString::null, 0, 1 ); }
i nasz programik jest gotowy. Dodamy jeszcze mały bajer - polskie znaki :)). Zasada wyświetlania polskich znaków diakrytycznych polega na wskazaniu kodeka jaki ma zostać użyty przy konwertowaniu tablicy znaków *char do QString. Wykonujemy to w funkcji init():
#include void frm1::init() { QTextCodec::setCodecForCStrings( QTextCodec::codecForName("ISO8859-2") ); }
|