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().