Programowanie w systemie Linux. rc6.3 ©2003

Transkrypt

Programowanie w systemie Linux. rc6.3 ©2003
Programowanie w systemie Linux. rc6.3 ©2003-2007 Jacek Lach
• Kdevelop 3 i Qt Designer
• Następnie zdefiniujemy działanie przycisków wykorzystując możliwości
• Uruchamiamy Kdevelopa
• Tworzymy nowy projekt (Project->New project)
• Uruchamia się kreator projektu:
• Jako typ projektu wybieramy C++/QMake project/Application
• Wybieramy nazwę projektu (Edytor) i lokalizację plików projektu
• Na kolejnych stronach kreatora określamy dodatkowe właściwości
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
projektu. Finish
Po utworzeniu projektu, kompilujemy go i sprawdzamy jak działa (Build
project – F8). Przed skompilowaniem projektu należy potwierdzić
uruchomienie programu qmake w celu wygenerowania pliku Makefile dla
projektu
W następnej kolejności chcemy zmodyfikować interfejs naszego programu.
Tworzymy nowy plik zawierający opis naszego interfejsu wybierając z menu
File pozycję New i w ukazującym się oknie dialogowym określamy nazwę
dla pliku (mainwindowbase) oraz korzystając z listy rozwijanej określamy typ
pliku jako Main Window (.ui).
Plik dołączamy do podprojektu src.
Otwieramy zakładkę File groups i z grupy User Interface wybieramy plik
mainwindowbase.ui
Rozpoczynamy pracę z QtDesignerem
Ustawiamy nazwę głównego widgetu (w oknie edytora właściwości - Property
editor) na MainWindowBase (było: Form1, Property editor: name) Będzie to
nazwa klasy, na podstawie, której utworzymy klasę okna głównego. Tytuł
okna to właściwość caption
Klikamy prawym klawiszem na obszarze widgetu głównego i z menu
kontekstowego wybieramy Add toolbar
Wypełniamy pasek narzędziowy przeciągając wybrane akcje z edytora akcji
(Action editor) do paska narzędziowego (Cut, Copy, Paste, Redo, Undo).
Wstawiamy do okna widget Rich Text Edit, ustawiamy nazwę widgetu:
textEdit.
Zapisujemy projekt File->Save. Zamykamy designera.
Pliki edytor.h i edytor.cpp można usunąć z projektu. Otwieramy zakładkę
Qmake Manager i z menu kontekstowego dla wskazanych plików wybieramy
Usuń.
Z menu kontekstowego dla pliku mainwindowbase.ui wybieramy kreatora
podklas (Sublassing Wizard). Podajemy nazwę klasy: MainWindow.
Zostawiamy zaznaczenie metod: fileExit(), fileNew(), fileOpen(), fileSave(),
fileSaveAs(), helpAbout() (pozostałe zostaną usunięte/zdefiniowane w inny
sposób). Zaznaczamy: Przeformatuj źródła. Utwórz. Pliki zostaną dodane do
projektu.
W pliku main.cpp zamieniamy #include ”edytor.h” na #include
”mainwindow.h”. Zmienna mw (typu Edytor*) powinna być typu
MainWindow * - zmienić.
[Zamknąć projekt i ponownie go otworzyć]
Z menu kontekstowego zakładki mainwindowbase.ui (jeśli potrzeba to
otworzyć plik) wybieramy pozycję umożliwiającą wskazanie pliku z
implementacją klasy (Create or Select Implementation). W oknie dialogowym
wyboru klasy implementacji dla MainWindowBase wybieramy użycie
istniejącej klasy MainWindow
Sprawdzić poprawność projektu: skompilować i uruchomić.
Jeżeli aplikacja ma oczekiwany wygląd możemy przejść do zmiany działania
programu otwierając ponownie designera poprzez wybranie w zakładce
plików projektu pliku: mainwindowbase.ui.
Wybieramy główny widget i wybieramy Layout Out Vertically z menu Layout
(Układ), aby obszar edycji został automatycznie dopasowany do rozmiaru
okna głównego.
•
•
•
•
•
•
•
•
używanego widgetu edycji tekstu.
Aby tego dokonać wybieramy akcję editRedoAction w Edytorze akcji (Action
Editor) i naciskamy przycisk łączenia akcji (Connect current action). W oknie,
które się otworzy wybieramy sygnał activated() i łączymy go ze slotem redo()
widgetu textEdit. Rozłączamy sygnał z domyślnym slotem z MainWindow,
ponieważ wystarcza nam działanie dostarczane z widgetem edycji tekstu. OK.
Tą samą operację powtarzamy dla editUndoAction, editCutAction,
editCopyAction, editPasteAction.
Po wykonaniu powyższych kroków dodajemy własną akcję: włączenie
pogrubiania tekstu. Tworzymy nową akcję wybierając New Action w edytorze
akcji. Akcji nadajemy nazwę editBoldAction (Property editor). Zdefiniujemy
również dla tej akcji przycisk na pasku narzędziowym więc wybierzmy
jeszcze dla akcji ikonę (iconSet). Zmieniamy opis akcji w polu text w edytorze
własności. Zmieniamy własność toggleAction na True (oczekujemy
możliwości włączania / wyłączania pogrubienia). Dodajemy przycisk
związany z akcją przeciągając akcje do odpowiedniego miejsca na pasku
narzędzi. Jak w przypadku poprzednich akcji dokonujemy połączenia sygnału
z odpowiednim slotem. Tworzymy nowe połączenie (przycisk New), tym
razem jest to sygnał toggled() (taki typ wybraliśmy we właściwościach).
Łączymy go ze slotem textEdit::setBold(). W edytorze własności definiujemy
skrót klawiszowy dla akcji (^b) wpisując Ctrl+B w polu accel.
Działanie naszego projektu możemy podejrzeć wybierając z menu Okno
pozycję Preview Form (Podgląd formularza).
W tej chwili projekt realizuje część zaplanowanych zadań. Pozostało nam
zdefiniowanie slotów odpowiadających otworzeniu pliku, zapisaniu,
zamknięciu aplikacji oraz dialog About w menu Help.
Dla porządku usuwamy akcje helpIndexAction, helpContentsAction,
editFindAction, filePrintAction. Usuwamy również nieużywane już sloty z
projektu przy pomocy okna dialogowego dostępnego po wybraniu pozycji
Slots z menu Edit (można również usunąć sloty dla akcji, które zostały
połączone ze slotami widgetu RichTextEdit – editCut, editCopy, editPaste,
editUndo, editRedo).
Poprawność przypisanych skrótów klawiaturowych możemy sprawdzić
wybierając Check Accelerators z menu Edit.
Nadeszła pora na wprowadzenie do projektu kodu definiującego pozostałe
działania.
Do edycji odpowiednich metod można przejść otwierając w edytorze plik
MainWindow.cpp, bądź wybrać w exploratorze obiektów w zakładce
Members slot, kŧóry chcemy edytować.
W poniższym przykładowym kodzie używana jest zmienna fileName typu
Qstring. Może ona być składową klasy bazowej lub pochodnej. Aby dodać
element do klasy MainWindowBase należy w QtDesignerze w oknie Object
Explorer wybrać zakładkę Members i do zmiennych klasy dodać Qstring
fileName; Do kompilacji kodu wymagane są pliki nagłówkowe:
<qapplication.h> <qmessagebox.h> <qfiledialog.h> <qstatusbar.h>
void MainWindow::fileExit()
{ qApp->closeAllWindows(); }
void MainWindow::fileNew()
{ TextEdit->clear(); fileName=""; }
void MainWindow::fileOpen()
{
fileName = QFileDialog::getOpenFileName(".",
QString::null, this, "opendlg", tr("Open File"));
if (fileName.isEmpty()) {
statusBar()->message(tr("Cancelled"), 3000);
return;
}
QFile file( fileName );
if ( file.open( IO_ReadOnly ) ) {
QTextStream stream( &file );
TextEdit->setText( stream.read() );
TextEdit->setTextFormat(RichText);
}
}
void MainWindow::fileSave()
{
if(fileName.isEmpty()) {
fileSaveAs();
return;
}
QFile file( fileName );
if ( file.open( IO_WriteOnly ) ) {
QTextStream stream( &file );
stream << TextEdit->text();
TextEdit->setModified( FALSE );
file.close();
}
}
void MainWindow::fileSaveAs()
{
fileName = QFileDialog::getSaveFileName(".",
QString::null, this, "savedlg", tr("Save File"));
if(!fileName.isEmpty()) { fileSave(); }
}
void MainWindow::helpAbout()
{
QMessageBox::about(this, tr("About Edytor"),
tr("Simple editor"));
}
void MainWindow::closeEvent(QCloseEvent *ev)
{
switch(QMessageBox::information(this,
tr("Confirmation"), tr("Do you really want to
quit?"), QMessageBox::No, QMessageBox::Yes ))
{
case QMessageBox::No :
ev->ignore();
break;
case QMessageBox::Yes :
ev->accept();
break;
}
}