QT prn


Programowanie GUI  część 1
1.1 UrzÄ…dzenia sterujÄ…ce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Składniki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4 Biblioteki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.5 Wybór biblioteki oraz języka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Maciej WoÅ‚oszyn WFiIS AGH (http://fatcat.ftj.agh.edu.pl/~woloszyn) ©29 lutego 2012
A
Dokument przygotowany za pomocą systemu LTEX. Formatowanie kodu może wynikać z wymogów wersji prezentowanej w formie slajdów  proszę
go wtedy nie traktować jako wzór do naśladowania. Informacje o znalezionych błędach oraz propozycje zmian i uzupełnień proszę wysyłać na
adreswoloszyn@fatcat.ftj.agh.edu.pl. Wszelkie prawa zastrzeżone.
Graficzny Interfejs Użytkownika
" GUI (graphical user interface)  sposób interakcji użytkownika z komputerem (lub podobnym urządzeniem)
poprzez graficznÄ… reprezentacjÄ™ danych i operacji na nich (np. ikony, przyciski, menu)
" użytkownik posługuje się w tym celu urządzeniem (np. mysz, touchpad) sterującym tzw. kursorem
" zastępuje (lub uzupełnia) CLI (command line interface)
1.1 UrzÄ…dzenia sterujÄ…ce
" mysz, trackball, touchpad lub podobne urzÄ…dzenia sterujÄ…ce kursorem
" ekran dotykowy
" klawiatura (skróty, sterowanie kursorem)
" system rozpoznawania głosu
" dodatkowe urządzenia/sensory, np. pióro świetlne (obecnie rzadko spotykane), czujniki położenia urządzeń
przenośnych
1.2 Historia
" pierwsze idee  pomysł urządzenia Memex (Vannevar Bush, lata 30-te XX w., rozwinięcie 1945)
" pomysły Busha zainspirowały Douglasa Engelbarta  w 1968 zaprezentował NLS (oN-Line System)
urządzenie obsługiwało m.in. wynalezioną przez Engelbarta mysz i wykorzystywało pomysł dokumentów
hipertekstowych
" Xerox PARC (Palo Alto Research Center)  komputer Xerox Alto (1973)
oraz Xerox Star 8010 Document Processor (1981, 17 000$)
" Apple Lisa (1983, 10 000$)
" Apple Macintosh (1984, 2 495$)
9-calowy monochromatyczny ekran (512x384), 128kB RAM, brak wielozadaniowości
1
M.Wołoszyn  Programowanie GUI, cz. 1 (29 lutego 2012) 2
" X Window System (1984, MIT)  system Unix i pokrewne
 jest to tylko szkielet graficznego interfejsu użytkownika; dodatkowo potrzebne są np. window manager,
biblioteka elementów GUI
" Windows 1.0 (1985)
" Amiga 1000 (1985)
1.3 Składniki
widget (window+gadget ?), inaczej kontrolka
" Button  wywołanie pewnej akcji
" Checkbox  wybór dwustanowy (włączony/wyłączony), czasem dostępny trzeci stan: element nieaktywny
" Radio Button  grupa przycisków, spośród których włączony może być tylko jeden
" Icon  graficzny symbol np. pliku, folderu, aplikacji, funkcji programu; zapisywana najczęściej w formatach
ICO, BMP (MS Windows) lub PNG, SVG (inne systemy)
" Toolbar  zestaw przycisków, zwykle z ikonami często wykonywanych operacji
M.Wołoszyn  Programowanie GUI, cz. 1 (29 lutego 2012) 3
" Label
" List
" Spinner
" Slider
" Menu  rozwijana lista komend i opcji
" Context Menu (Pop-up Menu)  menu kontekstowe
M.Wołoszyn  Programowanie GUI, cz. 1 (29 lutego 2012) 4
" Pie Menu (Radial Context)
" Tree View  hierarchiczny układ informacji
" Status Bar  zwykle w dolnej części okna
" Table (Grid View, Datagrid)  często dodatkowe możliwości: przesuwanie/ukrywanie kolumn, sortowanie
" Scrollbar (Slider)  wersje poziome, pionowe
" Progress Bar  także wersja do wykorzystania gdy nie jest znane  maksimum
" Text Box (Edit Field)  nie zawsze muszą dopuszczać edycję tekstu
M.Wołoszyn  Programowanie GUI, cz. 1 (29 lutego 2012) 5
" Tooltip
" Tabbed Pane
" Application/Document Window   zwykłe okna aplikacji, dokumentu otworzonego przez program itp.
" Dialog Box
" Modal Window (Modal Dialog)  blokuje dalsze działanie programu
" Combo box  kombinacja pola tekstowego i listy rozwijanej, w razie potrzeby uzupełniona przez scrollbar;
może umożliwiać edycję (np. pasek adresu w przeglądarkach WWW)
M.Wołoszyn  Programowanie GUI, cz. 1 (29 lutego 2012) 6
" oraz wiele innych, dostępnych w poszczególnych zestawach widgetów  np. dialogi otwierania/zapisywania
plików, drukowania, Color Chooser. . .
Uwaga:
tzw. focus (skupienie)  stan, w którym może być równocześnie tylko jeden widget w całym systemie okienkowym;
naciśnięcie przycisku na klawiaturze przekazuje informację do elementu, który  posiada focus.
1.4 Biblioteki
toolkit  zbiór widgetów
" niskopoziomowe:
 Windows API (application programming interface)
 Macintosh API
 niskopoziomowe biblioteki dla X Window
" wysokopoziomowe
  nakładki na Windows API:
" MFC (Microsoft Foundation Classes)  do niedawna standardowe narzędzie używane w środowi-
skach programistycznych Micorsoftu
" Windows Forms  GUI na platformie .NET
" OWL (Object Windows Library)  Borland, alternatywa dla MFC
" VCL (Visual Component Library)  Borland, wykorzystywane przez C++ Builder oraz Delphi
 Unix, X Window system:
" Motif
" Lesstif  open source owa wersja Motifa
" Xaw (Athena Widget Set)
 wiele platform, języki C/C++ (często także dowiązania dla innych języków):
" Qt  dostępna jako open source oraz w wersjach komercyjnych dla platform Unix/Linux (X Window),
MS Windows, Mac OS X, embedded; wykorzystywana przez środowisko KDE
" GTK+  open source, pierwotnie dla X Window, obecnie także na innych platformach; korzystają
z niej m.in. GNOME i XFCE
" wxWidgets (dawniej wxWindows)
" FLTK  open source, zaprojektowana pod kątem wydajności i niewielkiego zużycia zasobów
M.Wołoszyn  Programowanie GUI, cz. 1 (29 lutego 2012) 7
" FOX  open source
 wiele platform, język Java:
" AWT (Abstract Windowing Toolkit)
" Swing  dodany w nowszych wersjach Javy
" SWT (Standard Widget Toolkit)  część projektu Eclipse, umożliwia wykorzystanie widgetów plat-
formy, na której działa maszyna wirtualna Javy (np. API Windows albo GTK+)
1.5 Wybór biblioteki oraz języka
?
Literatura
" Jeremy Reimer, A History of the GUI,http://arstechnica.com/articles/paedia/gui.ars
" Mike Tuck, The Real History of the GUI,http://www.sitepoint.com/print/real-history-gui
" A Visual Guide to the Swing Components,http://docs.oracle.com/javase/tutorial/ui/features/
components.html
Programowanie GUI  część 2
2.1 Biblioteka Qt  wstęp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2.2 Pierwszy program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.3 Qt Assistant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.4 Obsługa zdarzeń: sygnały i sloty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.4.1 WÅ‚asne sloty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.4.2 Własne sygnały . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.4.3 Predefiniowane sygnały . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4.4 Predefiniowane sloty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Literatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Maciej WoÅ‚oszyn WFiIS AGH (http://fatcat.ftj.agh.edu.pl/~woloszyn) ©7 marca 2012
A
Dokument przygotowany za pomocą systemu LTEX. Formatowanie kodu może wynikać z wymogów wersji prezentowanej w formie slajdów  proszę
go wtedy nie traktować jako wzór do naśladowania. Informacje o znalezionych błędach oraz propozycje zmian i uzupełnień proszę wysyłać na
adreswoloszyn@fatcat.ftj.agh.edu.pl. Wszelkie prawa zastrzeżone.
Qt cz.1
Jak podaje Wikipedia QT to m.in. . . .
" The Qt toolkit, a cross platform graphical widget toolkit for the development of GUI computer programs.
2.1 Biblioteka Qt  wstęp
Education Course Material (1) The ideas behind Qt
1
M.Wołoszyn  Programowanie GUI, cz. 2 (7 marca 2012) 2
2.2 Pierwszy program
#include
#include
int main( int argc, char **argv ) {
QApplication app( argc, argv );
QLabel napis( " ... Witamy w Qt ... " );
napis.show();
return app.exec();
}
" QApplicationobsługuje parametry linii poleceń oraz zasoby wspólne dla całego programu
" napis.show()spowoduje, że wcześniej przygotowany widget stanie się widoczny (łącznie ze swoją zawar-
tością)
" app.exec()przekazuje dalsze sterowanie do pętli zdarzeń (obsługiwanej przez Qt)  program przechodzi
w stan  oczekiwania na działania użytkownika (mysz, klawiatura itd.)
Kompilacja
Zakładając, że przykładowy program umieszczony jest w plikumain.cppw kataloguHelloWorldwykonujemy
następujące kroki:
1. $qmake -project
Ò! powstanie niezależny od platformy plik projektuHelloWorld.pro:
##########################################
# Automatically generated by qmake (2.01a)
# czw. mar 10 08:15:54 2011
##########################################
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
# Input
SOURCES += main.cpp
2. $qmake
Ò! wygeneruje odpowiedni dla danego systemu plikMakefile
3. $make
Ò! przeprowadzi kompilacjÄ™ programu  otrzymamy plik wykonywalnyHelloWorld
2.3 Qt Assistant
" dokumentacja biblioteki i system pomocy dla narzędzi Qt są dostępne w wygodny sposób poprzez instalowaną
domyślnie z biblioteką aplikację Qt Assistant
jeśli zachodzi potrzeba uruchomienia z linii komend to wystarczy polecenie:
M.Wołoszyn  Programowanie GUI, cz. 2 (7 marca 2012) 3
$assistant
! fatcat :
Uwaga! na serwerzefatcatzainstalowane są wersje Qt z obu serii: 3.x oraz 4.x (4.x nawet więcej niż jedna)
 na pierwszych zajęciach laboratoryjnych podane zostaną szczegóły
2.4 Obsługa zdarzeń: sygnały i sloty
Schemat przekazywania informacji o zdarzeniach w Qt:
" widgety wysyłają (emitują) sygnały zawierające informacje o zdarzeniu (np. została wybrana 5-ta pozycja na
liście)
" sygnały są odbierane przez specjalnie do tego przeznaczone funkcje nazywane slotami (które są wtedy au-
tomatycznie uruchamiane)
" do utworzenia par sygnał-slot służy metodaconnecturuchamiana z wykorzystaniem makr:
 SIGNAL dla metod z obiektu generujÄ…cego zdarzenie
(np. funkcjaclicked()obiektu reprezentujÄ…cego przycisk)
 SLOT dla metod obsługujących zdarzenia
(np.quit()klasyQApplication)
Przykład:QPushButtonemituje sygnałclicked()gdy użytkownik kliknie przycisk
#include
#include
int main( int argc, char **argv ) {
QApplication app( argc, argv );
QPushButton ok( "Zakoncz" );
QObject::connect( &ok, SIGNAL(clicked()),
&app, SLOT(quit()) );
M.Wołoszyn  Programowanie GUI, cz. 2 (7 marca 2012) 4
ok.show();
return app.exec();
}
" każdy sygnał może być połączony z dowolną ilością slotów (albo nawet z innym sygnałem!)
" mogą mieć dowolną ilość argumentów dowolnego typu
" do pojedynczego slotu można podłączyć wiele sygnałów
2.4.1 WÅ‚asne sloty
" mogą się pojawiać w klasach dziedziczących poQObject(niekoniecznie związanych z GUI!) lub jej podklasach
(np.QWidget)
" mogą mieć dowolną ilość argumentów dowolnego typu
Przykład: program definiujący osobny obiekt reagujący na naciśnięcie przycisku (3 oddzielne pliki):
Writer.h
#include
#include
class Writer : public QObject {
Q_OBJECT
public slots:
void write();
};
Writer.cpp
#include "Writer.h"
void Writer::write() {
std::cerr << "#\n";
}
main.cpp
#include
#include
#include "Writer.h"
int main( int argc, char **argv ) {
QApplication app( argc, argv );
M.Wołoszyn  Programowanie GUI, cz. 2 (7 marca 2012) 5
QPushButton *b = new QPushButton("Wypisz  # ");
Writer *w = new Writer();
QObject::connect(b, SIGNAL(clicked()),
w, SLOT(write()) );
b->show();
return app.exec();
}
" tym razem wykonanie poleceniamakespowoduje dodatkowo wygenerowanie plikumoc_Writer.cppzawie-
rającego wynik działania programu moc (Meta-Object Compiler):
 klasy oznaczone makremQ_OBJECTsą parsowane i udostępniana jest z nich (już za pomocą standardo-
wych mechanizmów C++) funkcjonalność umożliwiająca m.in. działanie slotów i sygnałów
 wykorzystanie tego mechanizmu jest zautomatyzowane poprzez użyciemoc,qmakeiQObject(lub klas
potomnych)
 metody-sloty deklaruje się poprzez składnię typu:
public slots:
 klasa obsługująca sloty (Writer) musi dziedziczyć poQObject(albo po klasie odQObjectpochodzącej)
2.4.2 Własne sygnały
" można tworzyć klasy dziedziczące po bibliotecznych widgetach i definiować dla nich własne sygnały:
 słowo kluczowesignals+ automatyczne generowanie
  wysłanie sygnału za pomocąemit
 uwaga na możliwe nieskończone pętle!
Przykład: program służący do komunikacji między  naszymi obiektami1
Liczba.h
#include
class Liczba : public QObject {
Q_OBJECT
public:
Liczba() : n(0) { }
int getN() const { return n; }
public slots:
void setN(int _n) {
if (_n != n) {
n = _n;
emit zmiana(_n);
}
}
signals:
void zmiana(int _nowa);
private:
int n;
};
main.cpp
1
Uwaga! W dalszych przykładach nie zawsze cytowane są wszystkie dyrektywy#include,#ifndefitp.
M.Wołoszyn  Programowanie GUI, cz. 2 (7 marca 2012) 6
#include
#include "Liczba.h"
using namespace std;
int main() {
Liczba x,y;
QObject::connect(&x, SIGNAL(zmiana(int)),
&y, SLOT(setN(int)) );
cout << x.getN() << " " << y.getN() << endl;
x.setN(3);
cout << x.getN() << " " << y.getN() << endl;
y.setN(7);
cout << x.getN() << " " << y.getN() << endl;
return 0;
}
Ó!
0 0
3 3
3 7
2.4.3 Predefiniowane sygnały
" dla poszczególnych widgetów zdefiniowane są odpowiednie dla nich sygnały
przykład: klasaQSliderudostępnia m.in. sygnały:
 valueChanged(int value) zmiana wartości wybranej suwakiem
 sliderPressed() użytkownik  chwyta suwak
 sliderMoved(int value) suwak został poruszony
 sliderReleased() suwak został  puszczony
2.4.4 Predefiniowane sloty
" bardzo często tworzy się własne sloty, ale dostępnych jest również wiele gotowych slotów dla widgetów
przykład: klasaQProgressBarzapewnia m.in. sloty
 void reset() pokaż  brak postępu (0%)
 void setMaximum(int maximum)
 void setMinimum(int minimum)
 void setValue(int value)
int main( int argc, char **argv ) {
QApplication app(argc, argv);
QProgressBar p;
QSlider s;
s.setOrientation(Qt::Horizontal);
QObject::connect(&s, SIGNAL(valueChanged(int)),
&p, SLOT(setValue(int)) );
p.show();
s.show();
return app.exec();
}
M.Wołoszyn  Programowanie GUI, cz. 2 (7 marca 2012) 7
(2) The Qt object model and the signal slot concept
! Do samodzielnego przećwiczenia: proszę wykonać polecenia zawarte w plikuL2 Exercises.pdfw materiałach
dostępnych pod adresem powyżej.
Literatura
" Dokumentacja i tutoriale na stronach WWW
http://doc.qt.nokia.com
http://www.qtcentre.org
" Blanchette J., Summerfield M., C++ GUI Programming with Qt 4. Dostępne również on-line:
http://www.qtrac.eu/marksummerfield.html
" Ezust A., Ezust P., An Introduction to Design Patterns in C++ with Qt 4
" Ganczarski J., Owczarek M., C++. Wykorzystaj potęgę aplikacji graficznych
Programowanie GUI  część 3
3.1 Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
3.2 Tworzenie złożonych widgetów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Maciej WoÅ‚oszyn WFiIS AGH (http://fatcat.ftj.agh.edu.pl/~woloszyn) ©18 marca 2012
A
Dokument przygotowany za pomocą systemu LTEX. Formatowanie kodu może wynikać z wymogów wersji prezentowanej w formie slajdów  proszę
go wtedy nie traktować jako wzór do naśladowania. Informacje o znalezionych błędach oraz propozycje zmian i uzupełnień proszę wysyłać na
adreswoloszyn@fatcat.ftj.agh.edu.pl. Wszelkie prawa zastrzeżone.
Qt cz.2
(3) Widgets and layouts (do str.37)
3.1 Layout
" rozkład widgetów w oknie (lub innym elemencie) może być realizowany za pomocą gotowych schematów
" do dyspozycji sÄ…:
 QHBoxLayout układ poziomy
 QVBoxLayout układ pionowy
 QGridLayout siatka
" korzyści:
1
M.Wołoszyn  Programowanie GUI, cz. 3 (18 marca 2012) 2
 pozycjonowanie widgetów potomnych
 rozsądnie dobierane domyślne i minimalne rozmiary okien
 obsługa zmian rozmiaru
 automatyczne uwzględnianie dodawania/usuwania, ukrywania/pokazywania widgetów potomnych, zmian
w ich zawartości (tekst, fonty. . . )
" widgety dodajemy do layout-u metodÄ…
addWidget( QWidget * w )
" w przypadku klasyQGridLayoutpodajemy jeszcze rzÄ…d i kolumnÄ™, np.
layout->addWidget(button1, 0, 0);
layout->addWidget(button2, 0, 1);
można również spowodować rozciągnięcie widgetu na kilka rzędów/kolumn, np.
layout->addWidget(button3, 1, 0, 1, 2);
" layout nie pełni jednak roli widgetu-rodzica:
 klasyQHBoxLayout,QVBoxLayoutiQGridLayoutdziedziczÄ… po abstrakcyjnej klasieQLayout, a ta
z kolei poQObject(a nieQWidget!)
 dodajÄ…c widgety do layout-u nie przekazujemy wskaznika do  rodzica  zostanie nim automatycznie
obiekt, dla którego ustawiliśmy layout
main.cpp
QApplication app( argc, argv );
QWidget w;
QLabel l("Value: ");
QProgressBar p;
QSpinBox s;
s.setMaximum(100);
QObject::connect(
&s, SIGNAL(valueChanged(int)),
&p, SLOT(setValue(int))
);
QGridLayout gl;
gl.addWidget(&l,0,0);
gl.addWidget(&s,0,1);
gl.addWidget(&p,1,0,1,2);
w.setLayout(&gl);
w.show();
return app.exec();
" bardziej skomplikowane rozmieszczenia tworzy się zagnieżdżając dostępne schematy metodąaddLayout()
M.Wołoszyn  Programowanie GUI, cz. 3 (18 marca 2012) 3
QHBoxLayout vl;
QGridLayout gl1;
gl1.addWidget(new QPushButton("1"),0,0);
gl1.addWidget(new QPushButton("2"),0,1);
gl1.addWidget(new QPushButton("3"),1,0,1,2);
vl.addLayout(&gl1);
QGridLayout gl2;
gl2.addWidget(new QPushButton("4"),0,1);
gl2.addWidget(new QPushButton("5"),1,0,1,2);
gl2.addWidget(new QPushButton("6"),2,0);
vl.addLayout(&gl2);
3.2 Tworzenie złożonych widgetów
" wykorzystanie do:
 dziedziczenia po klasieQWidgetlub innej pochodzÄ…cej od niej
 zawierania innych widgetów
 layout-ów
 własnych dodatków/modyfikacji
MojWidget.h
class MojWidget : public QWidget
{
public:
MojWidget(QString s = "x=",
QWidget *parent = 0 );
protected:
QProgressBar* progressBar;
QSpinBox* spinBox;
QLabel* label;
QHBoxLayout *layout;
};
MojWidget.cpp
#include "MojWidget.h"
MojWidget::MojWidget(QString s, QWidget *parent)
: QWidget(parent)
{
progressBar = new QProgressBar();
spinBox = new QSpinBox();
spinBox->setSuffix(" %");
label = new QLabel(s);
layout = new QHBoxLayout;
M.Wołoszyn  Programowanie GUI, cz. 3 (18 marca 2012) 4
connect(
spinBox, SIGNAL(valueChanged(int)),
progressBar, SLOT(setValue(int))
);
layout->addWidget(progressBar);
layout->addWidget(label);
layout->addWidget(spinBox);
setLayout(layout);
}
main.cpp
#include "MojWidget.h"
int main( int argc, char **argv )
{
QApplication app( argc, argv );
MojWidget w;
w.show();
return app.exec();
}
main.cpp(zmodyfikowany)
QWidget window;
QVBoxLayout layout;
MojWidget wx("X = ");
MojWidget wy("Y = ");
MojWidget wz("Z = ");
layout.addWidget(&wx);
layout.addWidget(&wy);
layout.addWidget(&wz);
window.setLayout(&layout);
window.show();
M.Wołoszyn  Programowanie GUI, cz. 3 (18 marca 2012) 5


Wyszukiwarka

Podobne podstrony:
2006 02 Qt ISO Maker–moja pierwsza aplikacja w Qt [Programowanie]
QT
Fanuc 10T Mazak QT L088 85
2001 12 Geometry Classes Under Qt Programming
SloSyn MNC 263J QT M049 79
LAB 10 INF Ĺšrodowisko programowania QT student
inteface OBD2 prn
2007 02 Programowanie równoległe z Qt [Programowanie]
2002 03 Qt Tutorial Part 5
2001 11 Programming with Qt
2002 02 Qt Creating Interfaces
Titles qt Apache Nation
C GUI QT programowanie
l qt
dluznicy prn

więcej podobnych podstron