Programowanie w systemie Linux. rc6.6.01.12 Jacek Lach Qt4
Transkrypt
Programowanie w systemie Linux. rc6.6.01.12 Jacek Lach Qt4
Programowanie w systemie Linux. rc6.6.01.12 Jacek Lach Qt4 • Uruchamiamy narzędzie qtcreator, tworzymy nowy projekt Qt4 Gui Application, wprowadzamy nazwę, akceptujemy domyślne nazwy klas.. • Uruchamiamy narzędzie do edycji interfejsu graficznego poprzez wybranie pliku jego definicji: mainwindow.ui (w grupie Form - Formularze) • W obszarze okna umieszczamy widget Text Edit. • Dodajemy menu poprzez edycję pozycji menu: • • • • • • • • • • • • • File: New, Open, Save, Save as, Quit Edit: Undo, Redo, Cut, Copy, Paste, Underline Help: About W edytorze akcji (Action editor) pojawiają się akcje odpowiadające utworzonym pozycjom menu. Po zdefiniowaniu ikon dla poszczególnych akcji (z listy rozwijanej dla ikony wybieramy „Choose file”), uzupełniamy pasek narzędzi przeciągając do niego akcje z edytora akcji. (ikony: /usr/share/icons) Zapisujemy wynik. Przeglądamy pliki mainwindow.h: mainwindow.cpp: main.cpp: Definicja wyglądu aplikacji zostanie dołączona z pliku ui_mainwindow.h (zostanie wygenerowany podczas budowania projektu). Sprawdzić poprawność projektu: skompilować i uruchomić. Wybieramy główny widget i z menu kontekstowego wybieramy Layout Out Vertically z menu Lay out(Rozmieść), aby obszar edycji został automatycznie dopasowany do rozmiaru okna głównego. Następnie zdefiniujemy działania akcji wykorzystując istniejące możliwości używanego widgetu edycji tekstu. Aby umożliwić działanie cofnięcia operacji (Undo) wybieramy z menu kontekstowego dla wybranej akcji pozycję „Go to slot” i dalej sygnał triggered(). W automatycznie utworzonym slocie (podłączanym automatycznie na podstawie utworzonej nazwy) dodajemy ui->textEdit->undo(); Tą samą operację powtarzamy dla actionRedo, actionCut, actionCopy, actionPaste. Dla akcji actionQuit odbiorcą jest MainWindow a slotem close(). Połączenia sygnału i slotu można dokonać w zakładce edytora sygnałów i slotów. Po wykonaniu powyższych kroków edytujemy własną akcję: włączenie podkreślenia tekstu. W edytorze własności akcji actionUnderline zmieniamy własność checkable na true (oczekujemy możliwości włączania / wyłączania podkreślenia). Dodajemy przycisk związany z akcją przeciągając akcję do odpowiedniego miejsca na pasku narzędzi. W edytorze własności definiujemy skrót klawiszowy dla akcji (^u) wpisując Ctrl+U w polu shortcut. Jak w przypadku poprzednich akcji tworzymy slot („przejdź do slotu”) dla sygnału toggled(bool). Wewnątrz slotu aktywujemy slot setFontUnderline widgetu textEdit. ui->textEdit->setFontUnderline(arg1); arg1 jest nazwą parametru przekazywanego do slotu. Działanie naszego projektu możemy podejrzeć wybierając z menu Tools->Form Editor->Preview. 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. Do połączenia akcji z wybraną metodą można skorzystać z wywołania connect(), bądź z możliwości automatycznego tworzenia połączeń przyjmując jako nazwę metody ciąg o ustalonej postaci(jak poniżej). Poniższe metody są slotami. • W poniższym przykładowym kodzie używana jest zmienna fileName typu QString. ; Do kompilacji kodu wymagane są pliki nagłówkowe: #include <QtGui/QMainWindow> #include <QtCore/QString> #include <QtCore/QFile> #include <QtCore/QTextStream> #include <QtGui/QFileDialog> #include <QtGui/QMessageBox> #include <QtGui/QCloseEvent> • Sloty można dodać automatycznie korzystając z opcji „Go to slot” menu kontekstowego edytora akcji. void MainWindow::on_actionNew_triggered() { ui->textEdit->clear(); fileName=""; } void MainWindow::on_actionOpen_triggered() { fileName = QFileDialog::getOpenFileName( this, tr("Open File"), "."); if (fileName.isEmpty()) { ui->statusBar->showMessage(tr("Cancelled"), 3000); return; } QFile file( fileName ); if ( file.open( QIODevice::ReadOnly | QIODevice::Text ) ) { QTextStream stream( &file ); ui->textEdit->setText( stream.readAll() ); } } void MainWindow::on_actionSave_triggered() { if(fileName.isEmpty()) { on_actionSave_as_triggered(); return; } QFile file( fileName ); if ( file.open( QIODevice::WriteOnly | QIODevice::Text )) { QTextStream stream( &file ); stream << ui->textEdit->toHtml(); ui->textEdit->document()->setModified( false ); file.close(); } } void MainWindow::on_actionSave_as_triggered() { fileName = QFileDialog::getSaveFileName(this, tr("Open File"), "."); if(!fileName.isEmpty()) { on_actionSave_triggered(); } } void MainWindow::on_actionAbout_triggered() { 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; default : ev->ignore(); break; } } Dodajmy na koniec do linii statusu dodatkową informację o tekście (liczbę znaków). W klasie MainWindow dodajemy nowy slot updateStatistics(): void MainWindow::updateStatistics() { ui->statusBar->showMessage(QString::number( ui->textEdit->toPlainText().length())); } Aby aktualizacja była wyświetlana przy modyfikacji tekstu należy połączyć odpowiedni sygnał z naszym slotem w konstruktorze: connect(ui->textEdit, SIGNAL(textChanged()), this, SLOT(updateStatistics())); Nasza informacja wyświetla się jako standardowy komunikat, co oznacza, że może być nadpisana przez inne komunikaty. Aby stale wyświetlać informację można do paska statusu dodać widget – addPermanentWidget().