Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałKsenia Gregorczyk Został zmieniony 10 lat temu
1
Wstęp do Qt Qt to zestaw przenośnych bibliotek i narzędzi programistycznych dedykowanych dla języka C++ podstawowym składnikiem są klasy służące do budowy graficznego interfejsu programów komputerowych właścicielem Qt jest norweska firma Trolltech pierwsze wydanie powstało w 1995 r. platformy systemowe: GNU/Linux,BSD,Solaris,UNIX,Mac OS X,MS Windows aktualna wersja oprogramowania: 4.3.3
2
Narzędzia programistyczne Qt
moc - specjalny preprocesor, który na podstawie plików nagłówkowych (*.h) generuje dodatkowe pliki źródłowe (*.cpp) uic - kompilator plików *.ui zwykle generowanych za pośrednictwem programu Qt Designer qmake - program do zarządzania procesem kompilacji; jego głównym zadaniem jest utworzenie, a później aktualizacja pliku Makefile na podstawie prostego opisu zawartego w definicji projektu (*.pro) Qt Designer - aplikacja graficzna do definiowania graficznego interfejsu użytkownika Qt Linguist - aplikacja wspomagająca tłumaczenie programu na różne języki Qt Assistant - aplikacja zawierająca rozbudowany system pomocy dla programistów
3
Aplikacja „Hello” #include <QApplication> /* dołączenie odpowiednich bibliotek */ #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); /* utworzenie obiektu klasy QApplication, który odpowiada za działanie aplikacji */ QLabel *label = new QLabel("Hello Qt!"); /* utworzenie obiektu klasy QLabel; w konstruktorze użyto napisu, który zostanie przypisany etykiecie; możliwe jest tworzenie etykiet za pomocą języka HTML: QLabel *label = new QLabel("<h2><i>Hello</i><font color=red>Qt!</font></h2>" ) */ label->show(); /* wyświetlenie etykiety */ return app.exec(); /* przejście w stan czuwania*/ } jkhkhjkj hello.cpp
4
Instalacja i kompilacja
Dla systemu Windows (dla języka C++): Pracę z Qt najlepiej rozpocząć od odwiedzenia strony producenta - firmy Trolltech i ściągnięcia odpowiednich narzędzi (link). Po zainstalowaniu wszystkich narzędzi konieczna jest edycja zmiennej systemowej PATH, której nowymi wartościami powinny być ścieżki do katalogu /bin z katalogu z narzędziami Qt i katalogu z zainstalowanym programem MinGW. Teraz wszystkie narzędzia potrzebne do kompilacji będą zawsze widoczne po uruchomieniu „Wiersza poleceń”. Do jednego katalogu należy skopiować wszystkie pliki programu. Następnie wykonujemy kolejno następujące instrukcje: qmake –project qmake nazwa_katalogu.pro make (lub też mingw32-make) Dla systemu Linux: Po zainstalowaniu odpowiednich narzędzi wystarczy wykonać powyższe instrukcje.
5
Aplikacja „Quit” #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QPushButton *button = new QPushButton("Quit"); /* utworzenie obiektu klasu QPushButton - przycisku z etykietą „Quit” */ QObject::connect(button, SIGNAL(clicked()),&app, SLOT(quit())); /* ustawienie jednostronnego połączenia pomiędzy dwoma obiektami dwóch różnych klas; w przypadku kliknięcia w przycisk, wysyłany jest sygnał cliked(), który jest połączony z funkcją będącą slotem (quit()) */ button->show(); /* wyświetlenie przycisku */ return app.exec(); } quit.cpp
6
Aplikacja „Age” cz.1 #include <QApplication> #include <QHBoxLayout> #include <QSlider> #include <QSpinBox> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget *window = new QWidget; /* obiekt służący do zarządzania oknem aplikacji */ window->setWindowTitle("Enter Your Age"); /* ustawienie etykiety okna głównego */ QSpinBox *spinBox = new QSpinBox; QSlider *slider = new QSlider(Qt::Horizontal); spinBox->setRange(0, 130); /* ustawienie zakresu */ slider->setRange(0, 130); … } age.cpp
7
Aplikacja „Age” cz.2 … QObject::connect(spinBox, SIGNAL(valueChanged(int)),slider, SLOT(setValue(int))); QObject::connect(slider, SIGNAL(valueChanged(int)),spinBox, SLOT(setValue(int))); /* tutaj mamy przykład ustawienia dwustronnego połączenia pomiędzy obiektami dwóch różnych klas, których praca została zsynchronizowana */ spinBox->setValue(35); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(spinBox); /* dodanie odpowiedniego widżetu do układu */ layout->addWidget(slider); window->setLayout(layout); /* powyższe cztery linie służą do zaprogramowania odpowiedniego rozmieszczenia poszczególnych elementów w oknie aplikacji */ window->show(); return app.exec(); } age.cpp
8
Aplikacja „Age” cz.3 Rysunek ten pokazuje zależności pomiędzy obiektem klasy QSpinBox i QSlider. Dzięki odpowiednim połączeniu zmiana wartości jednego z obiektów powoduje w konsekwencji zmianę wartości drugiego. Jest to mechanizm synchronizacji pracy dwóch widżetów.
9
Menadżery układu Ułożenie widżetów w sposób przejrzysty bez naszej ingerencji jest możliwe dzięki specjalnym obiektom - menadżerom, które ustawiają rozmiar i pozycję widżetów w aplikacji. Wyróżniamy następujące klasy takich obiektów: - QHBoxLayout - ułożenie w poziomie (zazwyczaj od lewej do prawej) - QVBoxLayout - ułożenie w pionie QGridLayout – ułożenie w postaci siatki Do „zainstalowania” odpowiedniego menadżera służy funkcja: Qwidget::setLayout().
10
Asystent Qt Qt Assistant to bardzo przydatne narzędzie w poznawaniu biblioteki Qt. Zawiera bardzo obszerny opis wszystkich klas i funkcji potrzebnych do pracy.
11
Style Wygląd aplikacji w Qt można zmieniać dzięki użyciu różnych styli. Domyślne style są zależne od tego, w jakim systemie jest tworzona aplikacja.
12
Aplikacja „Find dialog” cz.1
#ifndef FINDDIALOG_H #define FINDDIALOG_H #include <QDialog> class QCheckBox; /* informacja dla kompilatora, że dane klasy istnieją */ class QLabel; class QLineEdit; class QPushButton; class FindDialog : public QDialog { Q_OBJECT /* jest to makro konieczne dla klas, w których definiowane są public: sygnały i sloty */ FindDialog(QWidget *parent = 0); /* parent - rodzic widżetu, domyślnie null */ signals: /* możliwe emitowane sygnały */ void findNext(const QString &str, Qt::CaseSensitivity cs); … finddialog.h
13
Aplikacja „Find dialog” cz.2
… void findPrevious(const QString &str, Qt::CaseSensitivity cs); /* Qt::CaseSensivity to typ wyliczeniowy, który przyjmuje dwie wartości: Qt::CaseSensitive lub Qt::CaseInsensitive */ private slots: /* słowo kluczowe slots jest to makro dla kompilatora C++ */ void findClicked(); void enableFindButton(const QString &text); private: QLabel *label; QLineEdit *lineEdit; QCheckBox *caseCheckBox; QCheckBox *backwardCheckBox; QPushButton *findButton; QPushButton *closeButton; }; #endif finddialog.h
14
Aplikacja „Find dialog” cz.3
#include <QtGui> /* plik zawierający definicję klas GUI */ #include "finddialog.h" FindDialog::FindDialog(QWidget *parent): QDialog(parent) { label = new QLabel(tr("Find &what:")); /* tr() - oznaczenie napisu do translacji */ lineEdit = new QLineEdit; label->setBuddy(lineEdit); /* buddy - widżet akceptujący podświetlenie przy wciśnięciu klawiszu skrótu */ caseCheckBox = new QCheckBox(tr("Match &case")); /* & - oznaczenie skrótu */ backwardCheckBox = new QCheckBox(tr("Search &backward")); findButton = new QPushButton(tr("&Find")); findButton->setDefault(true); /* wartość domyślna */ findButton->setEnabled(false); /* dostępność */ closeButton = new QPushButton(tr("Close")); … finddialog.cpp
15
Aplikacja „Find dialog” cz.4
… connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(enableFindButton(const QString &))); /* przycisk staje się dostępny jeżeli pojawi się sygnał o wpisaniu tekstu */ connect(findButton, SIGNAL(clicked()), this, SLOT(findClicked())); /* wywołanie findClicked() po kliknięciu */ connect(closeButton, SIGNAL(clicked()),this, SLOT(close())); QHBoxLayout *topLeftLayout = new QHBoxLayout; topLeftLayout->addWidget(label); /* dodawanie widżetu */ topLeftLayout->addWidget(lineEdit); QVBoxLayout *leftLayout = new QVBoxLayout; /* tworzenie obiektu menadżera */ leftLayout->addLayout(topLeftLayout); leftLayout->addWidget(caseCheckBox); leftLayout->addWidget(backwardCheckBox); … /* dzięki zagnieżdżeniu wszystkich rodzajów menadżerów możliwe jest dowolne ułożenie wszystkich widżetów w przjrzystej i czytelnej formie */ finddialog.cpp
16
Aplikacja „Find dialog” cz.5
… QVBoxLayout *rightLayout = new QVBoxLayout; rightLayout->addWidget(findButton); rightLayout->addWidget(closeButton); rightLayout->addStretch(); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addLayout(leftLayout); mainLayout->addLayout(rightLayout); setLayout(mainLayout); /* ustawienie układu głównego */ setWindowTitle(tr("Find")); /* etykieta dla okna głównego aplikacji */ setFixedHeight(sizeHint().height());/* QWidget::sizeHint() zwraca idealny rozmiar */ } finddialog.cpp
17
Aplikacja „Find dialog” cz.6
void FindDialog::findClicked() { /* slot findClicked() jest wywoływany jeżeli QString text = lineEdit->text(); wciśnięty zostanie przycisk wyszukiwania */ Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive; if (backwardCheckBox->isChecked()) emit findPrevious(text, cs); /* sprawdzanie czy zaznaczono wyszukiwanie do tyłu */ else emit findNext(text, cs); } void FindDialog::enableFindButton(const QString &text) { findButton->setEnabled(!text.isEmpty()); /* ustawianie dostępności przycisku */ /* Kompilacja programu odbywa się w sposób opisany wcześniej. W związku z tym, że klasa FindDialog zawiera makro Q_OBJECT plik wykonywalny generowany przez qmake zawiera specjalne zasady dla uruchomienia moc - meta - object compiler */ finddialog.cpp
18
Sygnały i sloty Jest to fundamentalny mechanizm w programowaniu przy użyciu bibliotek Qt. Umożliwia on programiście łączenie obiektów w sytuacji gdy obiekty „nie znają się”. Sloty są jak zwykłe funkcje w C++. Mogą być wirtualne, przeładowane, publiczne, chronione czy też prywatne. Ich parametry mogą być różnych typów. Różnica jest taka że sloty mogą być połączone z sygnałami co oznacza że są automatycznie wywoływane jeżeli sygnał zostanie wyemitowany. Składnia funkcji connect(): connect(sender, SIGNAL(signal), receiver, SLOT(slot)) Możliwe jest łączenie jednego sygnału do wielu slotów, wielu sygnałów do tego samego slotu, sygnału z sygnałem. Dane połączone można usunąć poprzez funkcję disconnect. Jeżeli chcemy połączyć sygnał ze slotem lub z innym sygnałem obydwa muszą mieć parametry tego samego typu, zapisane w tej samej kolejności. Jeżeli parametry są w złej kolejności lub jeśli sygnał lub slot nie istnieje pojawi się ostrzeżenie.
19
Meta - Object System Ważnym osiągnięciem było rozszerzenie Qt o język C++ z mechanizmem dla tworzenia niezależnego oprogramowania komponentowego. Mechanizm ten to meta - object system, który świadczy dwie kluczowe usługi: połączenie sygnał - slot introspekcja - funkcjonalność introspekcji jest potrzebna przy implementacji sygnałów i slotów i pozwala uzyskać dostęp do meta - informacji o podklasach klasy QObject podczas uruchomienia; mechanizm ten wspiera również właściwości obiektów (dla Qt Designer`a) a także translację tekstów Standard C++ nie dostarcza wsparcia dla meta - informacji potrzebnych dla meta – object system. Qt rozwiązuje ten problem poprzez moc, który analizuje definicje klasy Q_OBJECT i czyni te informacje dostępnymi poprzez funkcje z języka C++. Działanie mechanizmu: makro Q_OBJECT deklaruje kilka podstawowych funkcji narzędzie moc generuje implementację dla funkcji zadeklarowanych przez Q_OBJECT i dla wszystkich sygnałów i slotów funkcje klasy QObject takie jak connect() czy disconnect() używają tych funkcji
20
Qt designer Qt designer jest bardzo przydatnym narzędziem w tworzeniu aplikacji wykorzystujących bibliotekę Qt. Aplikacja ta służy do definiowania graficznego interfejsu użytkownika (może być używana do całkowitego lub częściowego jej tworzenia). Zaletą jest możliwość eksperymentowania z różnymi elementami bez konieczności ręcznego kodowania zmian.
21
Aplikacja „Go to cell” cz.1
Do utworzenia graficznego interfejsu użytkownika używamy programu Qt designer. Po utworzeniu formy i zapisaniu jej do pliku z rozszerzeniem *.ui należy stworzyć program główny dla aplikacji. #include <QApplication> #include <QDialog> #include "ui_gotocelldialog.h" /* jest to plik generowany, przez uic – user – interface int main(int argc, char *argv[]) compiler – kompilator interfejsu użytkownika, na { podstawie pliku *.ui do języka C++ */ QApplication app(argc, argv); Ui::GoToCellDialog ui; /* obiekt reprezentujący interfejs użytkownika */ QDialog *dialog = new QDialog; ui.setupUi(dialog); /* inicjalizacja formy */ dialog->show(); return app.exec(); } gotocell.cpp
22
Aplikacja „Go to cell” cz.2
Aplikacja stworzona przy użyciu Qt designer`a właściwie nie robi nic. Teraz musimy zaprogramować odpowiedni dialog z użytkownikiem. #ifndef GOTOCELLDIALOG_H #define GOTOCELLDIALOG_H #include <QDialog> #include "ui_gotocelldialog.h„ class GoToCellDialog : public QDialog, public Ui::GoToCellDialog { Q_OBJECT /* makro Q_OBJECT */ public: GoToCellDialog(QWidget *parent = 0); private slots: void on_lineEdit_textChanged(); }; #endif gotocelldialog.h
23
Aplikacja „Go to cell” cz.3
#include <QtGui> #include "gotocelldialog.h" GoToCellDialog::GoToCellDialog(QWidget *parent): QDialog(parent) { setupUi(this); /* inicjalizacja formy */ QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}"); /* akceptowalne wyrażenia regularne */ lineEdit->setValidator(new QRegExpValidator(regExp, this)); connect(okButton, SIGNAL(clicked()), this, SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); connect(lineEdit, SIGNAL(textChanged(const QString &)), this, SLOT(on_lineEdit_textChanged())); /* ustanowienie połączeń; dla przycisku okButton - accept(), cancelButton - reject(); ostatnie połączenie służy do ustawienia dostępności przycisku okButton jeżeli wprowadzony tekst jest poprawny */ } void GoToCellDialog::on_lineEdit_textChanged() /* sprawdzanie czy podane wyrażenie { jest poprawne */ okButton->setEnabled(lineEdit->hasAcceptableInput()); gotocelldialog.cpp
24
Rozszerzanie okien dialogowych cz.1
Dzięki Qt przy użyciu różnych wbudowanych mechanizmów możliwe jest tworzenie okien dialogowych przyjmujących różne kształty. #include <QtGui> #include "sortdialog.h" SortDialog::SortDialog(QWidget *parent): QDialog(parent) { setupUi(this); secondaryGroupBox->hide(); /* w konstruktorze część „secondary i tertiary” jest tertiaryGroupBox->hide(); ukrywana */ layout()->setSizeConstraint(QLayout::SetFixedSize); /* za rozmiar okna dialogowego od tego momentu odpowiada menadżer układu okna */ setColumnRange('A', 'Z'); /* ustawienie zakresu dla nazw kolumn */ } … sortdialog.cpp
25
Rozszerzanie okien dialogowych cz.2
… void SortDialog::setColumnRange(QChar first, QChar last) { primaryColumnCombo->clear(); /* wyczyszczenie ColumnBox - ów */ secondaryColumnCombo->clear(); tertiaryColumnCombo->clear(); secondaryColumnCombo->addItem(tr("None")); /* dodanie elementu „None” */ tertiaryColumnCombo->addItem(tr("None")); primaryColumnCombo->setMinimumSize(secondaryColumnCombo->sizeHint()); QChar ch = first; /* powyżej dodanie idealnego rozmiaru dla widżetu */ while (ch <= last) primaryColumnCombo->addItem(QString(ch)); /* dodanie elementów określających secondaryColumnCombo->addItem(QString(ch)); nazwy kolumn */ tertiaryColumnCombo->addItem(QString(ch)); ch = ch.unicode() + 1; } /* w aplikacji głównej dodatkowo ustawiamy zakres nazw dla kolumn wywołując } funkcję setColumn Range */ sortdialog.cpp
26
Rozszerzanie okien dialogowych cz.3
Qt designer dostarcza również inne obiekty przydatne w tworzeniu aplikacji, w których okna dialogowe mogą być w różny sposób rozszerzane. Prostym sposobem kontrolowania rozszerzeń jest np. tworzenie specjalnych etykiet na przyciskach, które łatwo zmienić za pomocą funkcji setText(), w zależności od tego w jakiej pozycji znajduje się okno dialogowe. Przykłady klas obiektów: QTabWidget – pozwala na tworzenie widżetów pełniących rolę zakładek QStackWidget i QListWidget – obiekty tych klas mogą być jednocześnie użyte, gdzie aktualna pozycja obiektu klasy QListWidget określa, którą stronę ma wyświetlić widżet będący obiektem klasy QStackWidget poprzez odpowiednie połączenie tych obiektów za pomocą sygnałów i slotów QStackWidget i QTreeWidget – podobne zastosowanie jak w powyższym przykładzie
27
Rozszerzanie okien dialogowych cz.4
Dynamiczne okna dialogowe są tworzone na podstawie plików z rozszerzeniem *.ui. Zamiast konwertować pliki *.ui do kodów źródłowych języka C++ możemy załadować te pliki bezpośrednio w trakcie uruchomienia programu za pomocą obiektów klasy QUiLoader. QUiLoader uiLoader; QFile file("sortdialog.ui"); QWidget *sortDialog = uiLoader.load(&file); if (sortDialog) { ... } QComboBox *primaryColumnCombo = /* użycie wzorca funkcji */ sortDialog->findChild<QComboBox *>("primaryColumnCombo"); if (primaryColumnCombo) { /* powyższy przykład pokazuje w jaki sposób możemy znaleźć obiekty - } widżety pochodne na podstawie zgodności nazwy i typu */ Aby możliwe było użycie obiektu klasy QUiLoader w naszej aplikacji należy dodać poniższą linię do pliku *.pro: CONFIG = uitools
28
Wbudowane widżety cz.1 różnego rodzaju przyciski:
QPushButton i QToolButton: służą do zainicjowania określonej akcji w przypadku kliknięcia QCheckBox: przydatne do zaznaczania że coś jest włączone lub też nie QRadioButton: wybór jednej z dostępnych opcji tzw. kontenery: są to widżety, które zawierają w sobie inne widżety
29
Wbudowane widżety cz.2 widżety, które służą do rozszerzania okien dialogowych - zawierają podstrony, które są potomkami widżetu głównego i które są numerowane widżety, które służą do obsługi dużej ilości danych
30
Wbudowane widżety cz.3 Qt zawiera również kilka prostych widżetów, które służą wyłącznie do wyświetlania informacji: QLabel - jest najważniejszy ze wszystkich widżetów tego typu; może być użyty do wyświetlania zwykłego tekstu a także obrazków (użycie HTML) QTextBrowser - bazuje na kodzie HTML (obsługa tabel, obrazków, list itp.) QProgressBar - ukazanie postępu
31
Wbudowane widżety cz.4 widżety, które służą do wprowadzania różnego rodzaju danych i informacji QLineEdit - jest podstawowym widżetem z tej kategorii QTextEdit - edytowanie większych ilości tekstu QDataEdit,QTimeEdit,QDateTimeEdit - widżety związane z czasem QScrollBar, QSlider,QDial - użycie specjalnego suwaka
32
Wbudowane widżety cz.5 widżety umożliwiające wybór czcionki czy też koloru widżety umożliwiające obsługę plików, funkcję drukowania, ustawiania strony
33
Wbudowane widżety cz.6 widżety specjalne, która służą do informowania użytkownika o pewnych zainstniałych sytuacjach, zachęcające do wykonania jakiejś akcji QProgressDialog - ukazanie postępu QinputDialog - zachęcenie użytkownika do podania jakiejś informacji QMessageBox, QErrorMessage - informujące użytkownika o jakiejś sytuacji
34
SEMINARIUM, III ROK INFORMATYKI UMCS
Bibliografia AUTOR: EMIL KRAWCZYŃSKI SEMINARIUM, III ROK INFORMATYKI UMCS
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.