Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Podobne dokumenty
Podstawy programowania w Qt4

Qt sygnały i designer

Praca z aplikacją designer

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

Programowanie w środowiskach RAD QtCreator, Qt i C++

Programowanie w środowiskach RAD Qt i C++

Rys. 1. Główne okno programu QT Creator. Na rysunku 2 oznaczone zostały cztery przyciski, odpowiadają kolejno następującym funkcjom:

The Graphics View Framework. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5. he Graphics View Framework - architektura

Implementacja aplikacji sieciowych z wykorzystaniem środowiska Qt

Qt - podstawowe cechy

Programowanie obiektowe

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Wprowadzenie do tworzenia zaawansowanych interfejsów graficznych: QGraphics View Framework vs. QML. Jakub Bogacz. Patryk Górniak

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Aplikacje w środowisku Java

PRZYJĘTE ZASADY GRY...3 ZAŁOŻENIA PROJEKTU...4 CZYM JEST I DLACZEGO QT?...5 DIAGRAM KLAS...7 DIAGRAM GRY SINGLE PLAYER...8 DIAGRAM MULTIPLAYERA...

Programowanie, część III

System X Window (I) Oprogramowanie i wykorzystanie stacji roboczych. Wykład 3. System X Window (III) System X Window (II)

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 3

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Analiza i projektowanie aplikacji Java

Zofia Kruczkiewicz - Modelowanie i analiza systemów informatycznych 2

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Wprowadzenie do projektu QualitySpy

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Qt - dialogi. Bogdan Kreczmer. ZPCiR ICT PWR pokój 307 budynek C3

Qt - edycja, obsługa zdarzeń, rozmieszczenie kontrolek

Klasy abstrakcyjne i interfejsy

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Układy VLSI Bramki 1.0

Signals + Threads: Qt vs. Boost

Praca w środowisku Visual Studio 2008, Visual C

Wstęp - Prosta aplikacja internetowa w technologii Java EE 5. Programowanie komponentowe 1

Politechnika Poznańska, Instytut Informatyki, TWO/GE. Programowanie dla ios

Król Łukasz Nr albumu:

1. Wybierz File New Application. Pojawi się nowa aplikacja w Delphi.

Delphi podstawy programowania. Środowisko Delphi

Kompleksowe tworzenie aplikacji klasy Desktop z wykorzystaniem SWT i

I - Microsoft Visual Studio C++

16) Wprowadzenie do raportowania Rave

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe

Wzorce projektowe cz. II. Wzorce projektowe cz. II 1/35

Java w 21 dni / Rogers Cadenhead. Gliwice, cop Spis treści. O autorze 11. Wprowadzenie 13 TYDZIEŃ I JĘZYK JAVA

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

1.Wstęp. 2.Generowanie systemu w EDK

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Projekt architektury systemów informatycznych Uniwersytetu Warszawskiego w oparciu o metodykę TOGAF. Tomasz Turski

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Qt hierarchia elementów graficznych

Temat 1. Podstawy Środowiska Xcode i wprowadzenie do języka Objective-C

Wykład 5 Okna MDI i SDI, dziedziczenie

Programowanie w środowisku graficznym GUI

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Tworzenie i wykorzystanie usług sieciowych

Systemy baz danych Prowadzący: Adam Czyszczoń. Systemy baz danych. 1. Import bazy z MS Access do MS SQL Server 2012:

Szkolenie. IBM Lotus - Podstawy projektowania aplikacji w Domino Designer 8.5. Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje

Programowanie obiektowe

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Fragmenty są wspierane od Androida 1.6

Dotacje na innowacje. Inwestujemy w waszą przyszłość.

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Zaawansowane programowanie w C++

Platforma Eclipse: Pluginy, RCP oraz GEF

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Podstawy programowania. Wprowadzenie

Klasy abstrakcyjne, interfejsy i polimorfizm

JAVA W SUPER EXPRESOWEJ PIGUŁCE

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Laboratorium 9 (Więcej Aktywności, w Androidzie)

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

SOA Web Services in Java

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

X Window System (I) Oprogramowanie i wykorzystanie stacji roboczych. Wykład 1. X Window System (III) X Window System (II)

Aplikacje w środowisku Java

I.Wojnicki, Tech.Inter.

Środowiska i platformy programistyczne

1 Wprowadzenie do J2EE

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Języki i paradygmaty programowania doc. dr inż. Tadeusz Jeleniewski

JAVA Materiały do laboratorium III wersja niezaawansowana Marcin Borkowski WSEiZ czerwiec 2006

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Programowanie obiektowe

MVC w praktyce tworzymy system artykułów. cz. 1

Dokumentacja do API Javy.

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Specyfikacja implementacyjna aplikacji mobilnej

Transkrypt:

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 1

Qt Trolltech http://www.trolltech.com/ LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 2

Qt Wprowadzenie Twórcy: norweska firma Trolltech, Qt jest ich głównym produktem. Podstawowy język biblioteki: C++ Pozostałe języki: Java, Python, Mono, i wiele innych. Qtopia środowisko oraz biblioteka dla urządzeń przenośnych. Zastosowania Qt: aplikacje wieloplatformowe (Mac OS X, Windows, Unix) głównie aplikacje techniczne, specjalistyczne, ale przede wszystkim KDE. oraz Borland z Kylix. Kto tego używa Qt? LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 3

Co może biblioteka Qt oprócz GUI? Szeroki zestaw klas pozwalający na budowanie aplikacji opartych na graficznym interfejsie użytkownika. Podsystem sieciowy. Niezależny od platformy bardzo wygodny interfejs gniazd oparty na sygnałach/slotach. Podsystem SQL, możliwość dołączania własnych sterowników. Funkcjonalność podobna do JDBC. Obsługiwane: MySQL, Oracle, ODBC, PostgreSQL, Sybase, IBM DB2 Wsparcie dla XML, parser SAX 2 (Simple API for XML), DOM Level 2. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 4

Qt Designer LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 5

Qt Designer Cechy charakterystyczne Służy tylko do tworzenia projektów wizualnych. Dodatkowo potrafi łączyć część komunikatów pomiędzy elementami widoku. Kolejne wersje ewoluowały. Trolltech nie mogła zdecydować się na konkretny profil tego narzędzia: pierwsze wersje służyły tylko do projektowania, kolejne wersje umożliwiały również częściową edycję kodu najnowsza wersja wraca do koncepcji tylko projektu wizualnego Wszystkie wersje Qt Designera były dostosowane do integracji z zintegrowanymi środowiskami programistycznymi: kdevelop (Linux) Visual Studio i w końcu Eclipse LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 6

Qt Designer Cechy charakterystyczne Projekt udostępnia ograniczoną liczbę komponentów, nastawiając się na możliwość dodawania własnych dostosowanych do konkretnych potrzeb (jaki to wzorzec projektowy?) Qt Designer zapisuje układ elementów na ekranie oraz ich projekt leksykalny w pliku z rozszerzeniem.ui (format xml). dialog.ui Plik ten jest za pomocą specjalnego narzędzia (uic) transformowany na kod w języku C++ (ui_dialog.h), który tworzy układ okienka. Oczywiście w środowiskach zintegrowanych cały proces jest zautomatyzowany (oprócz dołączania pliku nagłówkowego (ui_dialog.h))! moj_dialog.cpp uic ui_dialog.h #include <ui_dialog.h> LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 7

Jaki to wzorzec? Prezentacja Logika aplikacji Logika Biznesowa Qt Designer moj_dialog.cpp karta.cpp dialog.ui okno_glowne.cpp bankomat.cpp ui_dialog.h Pasywny widok/prezentacja Aktywna logika aplikacji, która zajmuje się nie tylko reakcją na komunikaty od użytkownika, ale także w odpowiedni sposób wyświetla dane na ekranie. Całe szczęście! Niezależna od nikogo logika biznesowa, która musi udostępniać informacje o swoim stanie za pomocą odpowiedniego interfejsu. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 8

Struktura programu GUI w Qt class diag «QAppli c ation» main.cpp «QM ainwindow» glowne_okno.cpp 1 1 0..* 0..* «QDialog» dialog.cpp «Designer_uiDialog» ui_dialog.h + setupui() : void 0..* «QWidget» komponent 1 LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 9

Struktura programu GUI w Qt - wyjaśnienie 1. Główny plik zawierający pętlę obsługi komunikatów. 2. Główne okno całej aplikacji, zawierające np menu, paski narzędziowe, pasek stanu itp.. class diag «QAppli c ation» main.cpp 1 1 «QM ainwindow» glowne_okno.cpp 3. Jedno z wielu okien dialogowych... 4. To okno wykorzystuje metodę setupui() z klasy nadrzędnej do konfiguracji projektu wizualnego. 0..* 0..* 8. Ta relacja oznacza, że okno dialogu odwołuje się bezpośrednio do komponentów. «QDialog» dialog.cpp «Designer_uiDialog» ui_dialog.h + setupui() : void 0..* 6. Wiele komponentów dostępnych w bibliotece Qt oraz zdefiniowanych przez użytkownika «QWidget» komponent 1 7. Ta relacja oznacza, że komponenty są zdefiniowane i zawierają się w klasie wygenerowanej przez uica 5. Plik wygenerowany (zazwyczaj automatycznie) przez kompilator uic z projektu wizualnego stworzonego w Qt Designer'ze LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 10

Przykład bez głównego okna W prostszym przykładzie zakładamy, że główny program tworzy bezpośrednio okno dialogowe. class diag_dialog «QAppli c ati... main.cpp «QDial og» dialog.cpp «Designer_ui... ui_dialog.h 1..* 0..* + setupui() : voi d 0..* «QWidget» komponent 1 LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 11

Kompletny kod dialog.h main.cpp #include <QDialog> #include <ui_dialog.h> #include <QApplication> #include <CFormLogin.h> class MojDialog : public QDialog, private Ui::ui_Dialog{ Q_OBJECT // to jest potrzebne ze względu // na sygnały i sloty w Qt! public: MojDialog(QWidget * parent); }; MojDialog::MojDialog(QWidget * parent = 0) { setupui(this); QObject::connect( cmdcancel, SIGNAL(clicked()), this, SLOT( accept() ) ); setwindowtitle( tr("pojedyncze dziedziczenie.") ); } int main(int argc, char *argv[]) { QApplication app(argc, argv); ui_dialog.h } MojDialog * dialog = new MojDialog; dialog->show(); return app.exec(); LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 12

main.cpp - (logika aplikacji) class diag_dialog «QApplic ati... main.cpp 1..* 0..* «QDialog» dialog.cpp «Designer_ui... ui_dialog.h + setupui() : void 0..* «QWidget» komponent 1 main.cpp #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); MojDialog * dialog = new MojDialog; dialog->show(); Pliki nagłówkowe, czyli importujemy biblioteki. Główny obiekt aplikacji. } return app.exec(); Przykładowe okno do pokazania. Wystartowanie pętli obsługi komunikatów. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 13

ui_dialog.h - (prezentacja) class diag_dialog «QApplic ati... main.cpp 1..* 0..* «QWidget» komponent «QDialog» dialog.cpp 1 0..* «Designer_ui... ui_dialog.h + setupui() : void #include <QtCore/QVariant> (...) #include <QtGui/QWidget> class auto_ui_dialog { public: QGridLayout *gridlayout; QFrame *frame_2; (...) QSpacerItem *spaceritem1; QPushButton *cmdcancel; QPushButton *cmdok; void setupui(qwidget *FormLogin) { Plik jest bardzo długi i tak naprawdę nie powinniśmy musieć nigdy go analizować. Na pewno nie można go ręcznie modyfikować, ponieważ jest automatycznie generowany przez kompilator uic. Z naszego kodu odwołujemy się do kontrolek za pomocą nazw które zdefiniowaliśmy w Qt Designer. FormLogin->setObjectName(QString::fromUtf8("FormLogin")); FormLogin->resize(QSize(362, 177).expandedTo(FormLogin->minimumSizeHint())); gridlayout = new QGridLayout(FormLogin); gridlayout->setobjectname(qstring::fromutf8("gridlayout")); QSizePolicy sizepolicy1(static_cast<qsizepolicy::policy>(0), static_cast<qsizepolicy::policy>(0)); cmdok = new QPushButton(frame); cmdok->setobjectname(qstring::fromutf8("cmdok")); cmdok->setdefault(true); cmdok->setflat(false); (...) QWidget::setTabOrder(txtPassword, cmdok); QWidget::setTabOrder(cmdOK, cmdcancel); } }; Ten obiekt będziemy dziedziczyć w naszej klasie. namespace Ui { class ui_dialog: public auto_ui_dialog {}; } // namespace Ui LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 14

dialog.cpp - (logika aplikacji) class diag_dialog «QApplic ati... main.cpp 1..* 0..* «QDialog» dialog.cpp «Designer_ui... ui_dialog.h + setupui() : void 0..* «QWidget» komponent 1 Stosujemy dziedziczenie. Dziedziczymy obiekt ui_dialog, który jest automatczynie generowany przez uic #include <QDialog> #include <ui_dialog.h> dialog.h class MojDialog : public QDialog, private Ui::ui_Dialog{ Q_OBJECT // to jest potrzebne ze względu // na sygnały i sloty w Qt! public: MojDialog(QWidget * parent); }; #include <QApplication> #include <CFormLogin.h> MojDialog::MojDialog(QWidget * parent = 0) { setupui(this); } Wywołujemy metodę setupui() do utworzenia układu wizualnego. dialog.cpp QObject::connect( cmdcancel, SIGNAL(clicked()), this, SLOT( accept() ) ); setwindowtitle( tr("wielokrotne dziedziczenie.") ); LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 15

Projekt wizualny w Qt Designer Label Line Edit Horizontal Spacer Push Button LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 16

Definiujemy nazwy komponentów objectname = txtusername objectname = txtpassword objectname = FormLogin objectname = cmdok objectname = cmdcancel LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 17

Zapiszmy nasz formularz W tym samy katalogu co przed chwilą utworzyliśmy projekt zapisujemy po nazwą: FormDialog.ui LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 18

Użyteczność - Zakryj hasło Wracamy do Designera, modyfikujemy atrybut echomode, zapisujemy. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 19

Tworzenie układu - layoutu Okno posiada główny układ (ang. layout) Elementy można grupować w mniejsze układy Układy mogą być rozmieszczane na ekranie wykorzystując puste wypełnienie Duży układ w formie siatki LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 20

Buddy elements Elementy skojarzone Skrót klawiaturowy przypisany opisowi (Label) automatycznie przełącza kursor do skojarzonej kontrolki. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 21

Qt..., a wzorzec MVC? LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 22

Programowanie Model-View Architektura model/view The model communicates with a source of data, providing an interface for the other components in the architecture. The nature of the communication depends on the type of data source, and the way the model is implemented. The view obtains model indexes from the model; these are references to items of data. By supplying model indexes to the model, the view can retrieve items of data from the data source. In standard views, a delegate renders the items of data. When an item is edited, the delegate communicates with the model directly using model indexes. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 23

Models, views, and delegates communicate with each other using signals and slots: Signals from the model inform the view about changes to the data held by the data source. Signals from the view provide information about the user's interaction with the items being displayed. Signals from the delegate are used during editing to tell the model and view about the state of the editor. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 24

Tworzenie nowego modelu Model musi spełniać pewne wymagania. Różne elementy interfejsu muszą udostępniać różne metody dostępu. Dla przykładu model udostępniający dane dla kontrolek z listami napisów. Plik nagłówkowy: class StringListModel : public QAbstractListModel { Q_OBJECT public: StringListModel(const QStringList &strings, QObject *parent = 0) : QAbstractListModel(parent), stringlist(strings) {} int rowcount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerdata(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; private: QStringList stringlist; }; LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 25

Tworzenie nowego modelu Przykładowa implementacja metody zwracającej różne dane o wskazanym elemencie dla różnych kontekstów: QVariant StringListModel::data(const QModelIndex &index, int role) const { if (!index.isvalid()) return QVariant(); if (index.row() >= stringlist.size()) return QVariant(); if (role == Qt::DisplayRole) return stringlist.at(index.row()); else return QVariant(); } W przypadku kontrolek indeksujących dane dwuwymiarowo (tabele) przykładowa implementacja może wyglądać: QVariant StringListModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role!= Qt::DisplayRole) return QVariant(); if (orientation == Qt::Horizontal) return QString("Column %1").arg(section); else return QString("Row %1").arg(section); } LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 26

Delegacje dla model/view w Qt Jeżeli chcemy dla danego pola utworzyć własną obsługę edycji danych musimy utworzyć własna klasę delegacji, a następnie zarejestrować ją w komponencie. Nowa delegacja musi implementować abstrakcyjna klasę QitemDelegate. Przykładowa deklaracja delegacji może wyglądać: class SpinBoxDelegate : public QItemDelegate { Q_OBJECT public: SpinBoxDelegate(QObject *parent = 0); QWidget *createeditor(qwidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; void seteditordata(qwidget *editor, const QModelIndex &index) const; void setmodeldata(qwidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; void updateeditorgeometry(qwidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; }; LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 27

Delegacje dla model/view w Qt Przykładowa implementacja metod tworzącej edytor na żądanie: QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const { QSpinBox *editor = new QSpinBox(parent); editor->setminimum(0); editor->setmaximum(100); return editor; } Uaktualniająca dane w edytorze. void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { int value = index.model()->data(index, Qt::DisplayRole).toInt(); } QSpinBox *spinbox = static_cast<qspinbox*>(editor); spinbox->setvalue(value); Uaktualniająca model: void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { QSpinBox *spinbox = static_cast<qspinbox*>(editor); spinbox->interprettext(); int value = spinbox->value(); model->setdata(index, value); } LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 28

Interakcja Dziękuję za uwagę. Chcemy być coraz lepsi! Jeżeli coś cię zainteresowało napisz e-maila: robert@iem.pw.edu.pl Jeżeli coś cię bardzo znudziło napisz e-maila: robert@iem.pw.edu.pl Jeżeli zauważyłeś błąd napisz e-maila: robert@iem.pw.edu.pl LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 29