Cze 14 2009
Kurs Qt - Część 3 - Zasoby
W tej części zrobimy coś pożytecznego. Napiszemy notatnik. Ale nie byle jaki. Będzie miał ikony! :D A co za tym idzie nauczymy się dołączać zasoby do naszej aplikacji. Czas przygotować ikony, które dołączymy do naszej aplikacji z poprzedniej cześciu kursu.
Plik zasobów to zwykły xml, który ma w sobie ścieżki do plików które mają być później dołączone do naszego programu. Plik zasobów wygląda tak:
- <RCC>
- <qresource prefix="/" >
- <file>copy.png</file>
- <file>cut.png</file>
- <file>paste.png</file>
- <file>open.png</file>
- <file>save.png</file>
- <file>new.png</file>
- </qresource>
- </RCC>
Jak widać składnia jest bardzo prosta. W przypadku Qt Creator mamy odpowiedni edytor, który w sposób klikany, załatwia za nas całą pracę (dodaj pozycję, wskaż plik, ciesz się życiem ;)). Nasz plik nagłówkowy się niewiele zmienił. Trochę go posprzątamy (wyrzucimy etykiety i przyciski, żeby zrobić miejsce pod pole edycji teksty, które dodamy w przyszłych częściach kursu) i dodamy wskaźniki do obiektów pasków narzędzi (linie 25. i 26.).
mainwindow.hpp:
- #ifndef MAINWINDOW_HPP
- #define MAINWINDOW_HPP
- #include <QApplication>
- #include <QtGui>
- {
- Q_OBJECT
- private:
- void createFileActions();
- void createEditActions();
- void createMenus();
- void createStatusBar();
- void createToolBar();
- public:
- MainWindow();
- };
- #endif // MAINWINDOW_HPP
Zastąpiliśmy dużą liczbę nagłówków jednym QtGui, który łączy w sobie inne związane z GUI. Stworzymy również dwie funkcje do definiowania akcji, dzięki czemu pozbędziemy się bałaganu definiowania ich w funkcji tworzącej menu, a później używania ich w przypadku toolbarów (tak, jedną akcję możemy wykorzystać w kilku miejscach). Przez to rozrósł się nam mainwindow.cpp:
- #include "mainwindow.hpp"
- MainWindow::MainWindow()
- {
- createFileActions();
- createEditActions();
- createMenus();
- createStatusBar();
- createToolBar();
- setMinimumSize(160, 160);
- resize(480, 320);
- }
- void MainWindow::createFileActions()
- {
- newAction->setStatusTip(tr("Nowy plik."));
- openAction->setStatusTip(tr("Otwórz istniejący plik."));
- saveAction->setStatusTip(tr("Zapisz plik."));
- quitAction->setStatusTip(tr("Wyjdź z programu."));
- quitAction->setShortcut(Qt::CTRL + Qt::Key_Q);
- connect (quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
- }
- void MainWindow::createEditActions()
- {
- copyAction->setStatusTip(tr("Kopiuj."));
- pasteAction->setStatusTip(tr("Wklej."));
- cutAction->setStatusTip(tr("Wytnij."));
- }
- void MainWindow::createMenus()
- {
- menuBar()->addMenu(fileMenu);
- fileMenu->addAction(newAction);
- fileMenu->addAction(openAction);
- fileMenu->addSeparator();
- fileMenu->addAction(saveAction);
- fileMenu->addSeparator();
- fileMenu->addAction(quitAction);
- menuBar()->addMenu(editMenu);
- editMenu->addAction(copyAction);
- editMenu->addAction(pasteAction);
- editMenu->addAction(cutAction);
- menuBar()->addMenu(helpMenu);
- helpMenu->addAction(tr("O &Qt"), qApp, SLOT(aboutQt()));
- }
- void MainWindow::createStatusBar()
- {
- statusBar()->showMessage(tr("Gotowy"));
- }
- void MainWindow::createToolBar()
- {
- fileToolBar->addAction(newAction);
- fileToolBar->addAction(openAction);
- fileToolBar->addAction(saveAction);
- addToolBar(fileToolBar);
- editToolBar->addAction(copyAction);
- editToolBar->addAction(pasteAction);
- editToolBar->addAction(cutAction);
- addToolBar(editToolBar);
- }
W stosunku do poprzedniej części kursu zmienił się trochę sposób tworzenia akcji (linie od 20 do 22). Teraz dodajemy do nich ikonę, poprzez klasę QIcon. Dwukropek oznacza wykorzystanie wcześniej zdefiniowanych zasobów. Jeżeli byśmy chcieli wykorzystać plik na dysku, to zamiast dwukropka używamy kropki. Ustawiamy również skrót klawiszowy. Możemy do tego celu wykorzystać gotowe ustawienia Qt, które to zmienią się, na natywny, w zależności od systemu na którym kompilujemy nasz program. Lub jak w linii 34. możemy na stałe przypisać wybrany skrót.
W tej chwili wystarczy dodać nasze akcje do menu lub toolbara. Jeżeli nasza pozycja w menu lub toolbarze ma tylko wywołać slot to zamiast definiować akcje lub sygnały wystarczy skorzystać z odpowiednej werji metody addAction (linia 75.), w której to podajemy kolejno nazwę pozycji, wskaźnik na klasę w której jest nasz slot oraz sam slot.
Tworzenie toolbara w Qt wygląda podobnie do menu. Tworzymy obiekt QToolBar (linia 85.), dodajemy do niego akcje (linie od 87. do 89.) oraz dodajemy nasz toolbar do okna (linia 91.). Musimy jeszcze dodać jedną linijkę, na koniec naszego pliku projektu (*.pro):
RESOURCES += resource.qrcPo kompilacji nasz program powinien wyglądać mniej więcej tak:

Tym razem to na tyle. Wiem, że bardzo krótko. Ponieważ zbliża się sesja, a niestety wychodzi na to że będzie trudniejsza niż plan zakładał, więc następna część kursu pojawi się za jakieś 2 tygodnie. Ale w ramach rekompensaty przedstawię wątki w Qt. Do następego!



14 Cze 2009, 19:35:53
Wiesz już może ile lekcji będzie zawierał kurs, masz jakiś plan co do tego? Po wszystkim świetnym posunięciem byłoby wydanie e-booka. trzymam kciuki za dalsze części, jednocześnie liczę, że nie będą się ukazywać co 2 tygodnie, tylko częściej.
14 Cze 2009, 19:42:05
@Grzegorz: bladego pojęcia nie mam. Prawdę mówiąc robię to trochę na żywioł. Ot, jeżeli kończą mi się pomysły o czym by tutaj napisać to piszę o tym o czym ludzie chcą przeczytać (stąd wielowątkowość w Qt), więc jako tako na ebooka się to nie nadaje (chyba że po przeredagowaniu). Więc kurs może się skończyć po wakacjach, jak również może się skończyć za rok, lub nigdy się nie skończyć.
A te dwa tygodnie to tylko przez sesję (chociaż tą część pisałem cały tydzień, bo jakoś nie miałem weny). I tak już mam dwa przedmioty do poprawy we wrześniu, więc nie mogę sobie pozwolić na więcej. Od lipca mam też zamiar ruszyć inne projekty które ostatnio wymyśliłem (zrobić film w 3D, sprawdzić jak działa reklama internetowa i ile ona daje, nauczyć się grać na gitarze czy doprowadzić do rozsądnego poziomu fooaudio, zrobić wreszcie mikrobloga tutaj). Mam tylko nadzieję że wystarczy mi na to wszystko czasu. :)
14 Cze 2009, 19:44:42
Bardzo ambitne plany. Powodzenia.
18 Cze 2009, 20:17:28
Dzis odkrylem ten kurs, poki co zapowiada sie swietnie :)
Oby ta sesja szybko Ci sie skonczyla i powodzenia :)
20 Cze 2009, 12:54:14
Panie kierowniku, a wiesz może, jak zapisać na dysku plik z zasobów? Tzn. wrzucam sobie do zasobów w projekcie plik PNG albo TXT, i chcę go zapisać na dysku.
20 Cze 2009, 13:26:13
@Dandys: nie robiłem nigdy czegoś takiego. Kwestia czy chcesz, żeby taki zasób był widziany przez użytkownika przed zapisem czy nie. Jeżeli tak, to wystarczy że wrzucisz go w odpowiednią formatkę, a później wykorzystasz QFileDialog. Jeżeli użytkownik nie miałby o tym wiedzieć, to rodzi się problem dla plików tekstowych (bo obrazki wystarczy wczytać do obiektu klasy QImage lub QPixmap i wywołać metodę save), gdyż trzeba się pobawić z klasami QFile i QTextStream.