5. Programmierung von Benutzerschnittstellen



Ähnliche Dokumente
Grundlagen der Informatik Entwicklung von Anwendungen mit dem Qt-Framework

5. Programmierung von Benutzerschnittstellen mit Qt

5. Programmierung von Benutzerschnittstellen mit Qt

Was ist QT? Beispiele: KDE Google Earth Mathematika

Qt Programmierung Teil 1 Fenster erstellen by NBBN ( CrashKurs-Artig. Was brauche ich? -Einige C++ Kenntnisse

Praktikum IKT 3. Semester

Einführung in die Programmierung

GUI Programmierung mit Qt

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Interaktive Simulationen Lektion 1/3: Event-Driven Design und Signals

Programmieren in Java

Vorkurs C++ Programmierung

Software Engineering. Zur Architektur der Applikation Data Repository. Franz-Josef Elmer, Universität Basel, HS 2015

Einführung in die Programmierung Wintersemester 2011/12

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java: Vererbung. Teil 3: super()

d:\c++\semesterarbeit\lottosix\lottosix.cpp /* ======================================================================== Dateiname: lottosix.

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Innere Klassen in Java

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Objektorientierte Programmierung

Anwenderdokumentation PersoSim

Einführung in die Programmierung

Objektbasierte Entwicklung

Einführung in die Programmierung (EPR)

Dokumentation zum Spielserver der Software Challenge

Prinzipien Objektorientierter Programmierung

Native Zeichenketten (C-Strings)

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Objektorientierte Programmierung für Anfänger am Beispiel PHP

LISP. Eine Einführung

Programmierkurs Java

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Typumwandlungen bei Referenztypen

Tel.: Fax: Ein Text oder Programm in einem Editor schreiben und zu ClassPad übertragen.

Installation und Inbetriebnahme von Microsoft Visual C Express

Einführung in die Java- Programmierung

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Algorithmen und Datenstrukturen

Grafische Benutzeroberfläche mit Glade und Python

Einführung in Javadoc

SEP 114. Design by Contract

Grundlagen von Python

Einführung in die Programmierung

Java Einführung Abstrakte Klassen und Interfaces

Kurzanleitung So geht s

Tutorial -

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Selbststudium OOP4 Auftrag

Bedienung von BlueJ. Klassenanzeige

Erstellen einer PostScript-Datei unter Windows XP

Delegatesund Ereignisse

5. Abstrakte Klassen

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Erstellen eines Screenshot

tentoinfinity Apps 1.0 EINFÜHRUNG

efa elektronisches Fahrtenbuch im Berliner Ruder-Club

Leichte-Sprache-Bilder

Benutzeroberflächen. Java Teil 4

Benutzerhandbuch. Leitfaden zur Benutzung der Anwendung für sicheren Dateitransfer.

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Dieses Dokument soll dem Administrator helfen, die ENiQ-Software als Client auf dem Zielrechner zu installieren und zu konfigurieren.

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Stepperfocuser 2.0 mit Bootloader

TEAMWORK-Uploader. Dokumentenaustausch mit dem PC

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Seite Out-Of-Band-Authentifizierung (OOBA) 8.1 Einleitung

Wir wünschen Ihnen viel Freude und Erfolg mit Ihrem neuen X-PRO-USB-Interface. Ihr Hacker-Team

4D Server v12 64-bit Version BETA VERSION

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Ihr CMS für die eigene Facebook Page - 1

In diesem Tutorial lernen Sie, wie Sie einen Termin erfassen und verschiedene Einstellungen zu einem Termin vornehmen können.

Inhaltstyp: Fotoalbum - Bilder in einer ansprechenden Form präsentieren. Erstellen eines Bildergalerieordners mit Bildern im Workplace

Datensicherung und Wiederherstellung

2 DAS BETRIEBSSYSTEM. 2.1 Wozu dient das Betriebssystem. 2.2 Die Bildschirmoberfläche (Desktop) Themen in diesem Kapitel: Das Betriebssystem

Jürgen Bayer. MDI-Anwendungen in C#

FastViewer Remote Edition 2.X

Objektorientierte Programmierung. Kapitel 12: Interfaces

Anleitung zum erstellen einer PDF-Datei aus Microsoft Word

Java Kurs für Anfänger Einheit 5 Methoden

Qt-Projekte mit Visual Studio 2005

1 Vom Problem zum Programm

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Kapitel 2 SAP Easy Access

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Kleines Handbuch zur Fotogalerie der Pixel AG

Hilfe zur Urlaubsplanung und Zeiterfassung

TeamSpeak3 Einrichten

Installationsleitfaden kabelsafe backup home unter MS Windows

Graphische Benutzungsoberflächen

Version 0.3. Installation von MinGW und Eclipse CDT

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 17: 3-Schichten-Architektur 2

Transkript:

5. Programmierung von Benutzerschnittstellen Inhalt: Rolle des Betriebssystems Win32 Programmierung mit Fenstern und Grafikausgabe Objektorientierte Programmierung von Benutzerschnittstellen mit Qt weitere Aspekte Peter Sobe 1

Qt Qt ist ein s.g. Widget-Toolkit zur Programmierung grafischer Benutzeroberflächen (engl. GUI) GUI: Graphical User Interface Widget: Komponente in einem grafischen Fenstersystem (vgl. Gadget, als kleines tragbares technisches Gerät) Qt ist als C++ Klassenbibliothek mit zusätzlichen Dienstprogrammen, z.b. MOC-Compiler, QT-Designer realisiert Peter Sobe 2

Qt Ein QT-Programm ist wesentlich übersichtlicher als ein Win32-Programm. Mini-Beispiel: #include <QApplication> #include <QPushButton> int main(int argc, char *argv[]) { QApplication a(argc, argv); QPushButton *button = new QPushButton("Ende"); button->show(); } QObject::connect(button, SIGNAL (clicked()), QApplication::instance(), SLOT (quit())); return a.exec(); Peter Sobe 3

Qt Qt-Designer als eigene Entwicklungsumgebung Die Qt-Bibliothek kann auch in Visual-Studio integriert werden. Peter Sobe 4

Qt Prinzipien: GUI-Komponenten sind Objekte, die zum Teil aus vorgefertigten Klassen instanziiert werden können. Neue Klassen d.h. neue GUI-Komponenten durch abgeleitete Klassen und durch neu erstellte Klassen, die mehrere GUI- Komponenten (Objekte) enthalten (Komposition) Die Bedienoberfläche besteht aus hierarchisch ineinander platzierten GUI-Komponenten (Widgets) MyWindow (public QMainWindow) QTextEdit QPushButton QPushButton Peter Sobe 5

Qt Prinzipien (Fortsetzung): Signal-Slot-Prinzip. Bedienereignisse (Button-Click, Scrollen) lösen Ereignisse (Signals) aus. Für diese Ereignisse werden Slotsprogrammiert, die Methoden aufrufen können Peter Sobe 6

Qt: Signal/Slot-Prinzip Signale werden von Widget-Objekten ausgesendet (emittiert, engl. emit) Die Entgegennahme erfolgt durch s.g. Slots, von denen ausgehend Methoden von QT-Klassen aufgerufen werden. Beispiel: QPushButton clicked() QApplication quit() Im Quellcode: QApplication appl(argc,argv); QPushButton button = new QPushButton( Beenden ); // QObject::connect(button, SIGNAL (clicked()), &appl, SLOT (quit()) ); Peter Sobe 7

Qt: Signal/Slot-Prinzip Signal/Slot-Prinzip: SIGNAL() und SLOT() sind C-Makros, die als Argumente Methoden der beteiligten Objekte erwarten. Ein Signal kann mit mehreren Slots verbunden werden. Mehrere Signale können mit einem Slot verbunden werden Frühere GUI-Bibliotheken nutzen die klassische Variante mit Callback- Funktionen, die an Bedienelemente gebunden wurden. Das von Qt benutze Signal/Slot-Prinzip ist flexibler und weniger fehleranfällig. Beispielsweise erfolgt beim Freigeben von Instanzen eine automatische Deaktivierung deren Slots; damit werden Programmabstürze vermieden. Peter Sobe 8

Qt: Klassen mit Signalen und Slots Signale und Slots werden an Klassen gebunden: Slot: Eine Methode die z. B. als public slot: void incrvalue(); deklariert wird. Ähnlich wie public, protected, private kann public slot verwendet werden. Die programmierte Methode (hier incrvalue()) wird aufgerufen, wenn ein Signal für den Slot vorliegt. Hinweis: public slot ist keine C++ Syntax und verlangt, dass der MOC eine Vorverarbeitung durchführt, die das Programm in Standerd-C++-Syntax überführt. Peter Sobe 9

Qt: Klassen mit Signalen und Slots Signal deklarieren und emittieren: In der Klassendeklaration muss eine Methode wie folgt enthalten sein: signals: void signalcarry(); // signalsiert einen Übertrag Die Methode signalcarry() wird nicht implementiert, sondern automatisch vom MOC erzeugt. In anderen Methoden der Klasse wird anwendungsspezifisch emit signalcarry(); aufgerufen. Hinweis: Auch die Verwendung von signals und emit ist keine Standard C++ Syntax und setzt die Umwandlung in C++ durch den MOC voraus Peter Sobe 10

Qt: Klassen mit Signalen und Slots Klasse cntr mit Slot für Incr und Signal für Carry: #include <QObject> class cntr :public QObject { Q_OBJECT public: cntr(int nvalues); int value(); public slots: void slot_incr(); signals: void carry(); private: int z; int nv; }; Zähler (cntr) soll von n bis nvalues-1 zählen und danach wieder auf Null springen. Übertrag soll durch die Signal- Methode carry() signalisiert werden. Peter Sobe 11

Qt: Klassen mit Signalen und Slots Nutzung der Klasse cntr: cntr counter(10); // im Hauptfenster connect(incrbutton, SIGNAL (clicked()), &counter, SLOT (slot_incr())); connect(&counter, SIGNAL(carry()), this, SLOT(slotShowCarry())); Die Slot-Methode des Hauptfensters zeigt den Übertrag an: void MyWindow::slotShowCarry() { QMessageBox msg(qmessagebox::information, QString("Information"), QString("Carry"),QMessageBox::Ok); msg.exec(); } Peter Sobe 12

Qt: Anordnung mehrerer Widgets Wie im Beispiel rechts sollen drei Knöpfe (Objekte des Klassentyps PushButton) untereinander angeordnet werden. Manuell programmiert: int main(int argc, char *argv[]) { QApplication a(argc, argv); QMainWindow *win = new QMainWindow(); QPushButton* b1 = new QPushButton("Max",win); QPushButton* b2 = new QPushButton("Min",win); QPushButton* b3 = new QPushButton("Quit",win); win->resize(120,180); b1->setgeometry(10,10,100,50); b2->setgeometry(10,65,100,50); b3->setgeometry(10,120, 100,50); // } win->show(); return a.exec(); x-pos.,y-pos., x-ausdehnung, y-ausdehnung Peter Sobe 13

Qt: Anordnung mehrerer Widgets Nutzung eines Layout-Manager-Objekts: int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget *win = new QWidget; win->resize(120,180); QVBoxLayout *layout_obj = new QVBoxLayout(win); QPushButton* b1 = new QPushButton("Max"); QPushButton* b2 = new QPushButton("Min"); QPushButton* b3 = new QPushButton("Quit"); b1->resize(100,50); b2->resize(100,50); b3->resize(100,50); } layout_obj->addwidget(b1); layout_obj->addwidget(b2); layout_obj->addwidget(b3); win->show(); return a.exec(); Peter Sobe 14

Qt: Anordnung mehrerer Widgets Nutzung eines Layout-Manager-Objekts: VBoxLayout und HBoxLayout QHBoxLayout *layout_obj = new QHBoxLayout(win); QPushButton* b1 = new QPushButton("Max"); QPushButton* b2 = new QPushButton("Min"); QPushButton* b3 = new QPushButton("Quit"); Peter Sobe 15

Einzelne Klassen in Qt Klassenhierarchie QObject QThread QWidget QAbstractButton QFrame QProgressBar QCheckBox QPushButton QRadioButton QAbstractScroll Area QGraphicsView QLabel QTextEdit Peter Sobe 16

Einzelne Klassen in Qt QMainWindow Wird als Hauptfenster einer Qt-Anwendung benutzt. Typischerweise leitet ein Programmierer eine neue Klasse, z.b. mywinwow von QMainWindow ab und platziert eigene Elemente im Fenster. Beispiel: MyWindow::MyWindow(){ addbutton = new QPushButton( Berechnen",this); addbutton->setgeometry(10, 110, 50, 40); Dokumentation unter: http://doc.qt.io/qt-5/qmainwindow.html#details Peter Sobe 17

Einzelne Klassen in Qt QMainWindow QMainWindow enthält eine Menu Bar und eine Status Bar als untergeordnete Widgets. Datei Modell abc.mod geladen QMainWinwod *win = new QMainWindow(); QMenu *filemenu = win>menubar()->addmenu("&datei"); filemenu->addaction("&beenden", myapp, SLOT(quit())); win->show(); win->statusbar()->showmessage(tr( Modell geladen"), 2000); Peter Sobe 18

Einzelne Klassen in Qt QLineEdit QLineEdit stellt eine einzeilige Ein- und Ausgabe-Box bereit MyWindow::MyWindow(){ lab = new QLabel(tr( Ein und Ausgabe"),this); eingabebox= new QLineEdit(this); ausgabebox = new QLineEdit(this); void MyWindow::ButtonClicked() // eine Slot-Methode { Qstring e,a; e = eingabebox()->text(); a.sprintf( %lf, e.todouble() * 2.0); ausgabebox->settext(a); // hier wird der Wert der Eingabe verdoppelt //ausgegeben Peter Sobe 19

Einzelne Klassen in Qt QTextEdit QTextEdit stellt eine mehrzeilige Editorfläche für Text bereit. Der Text kann durch einen Konstruktorparameter gesetzt werden. Konstruktoren: QTextEdit(QWidget *parent = 0); explicit QTextEdit(const QString &text, QWidget *parent = 0); Weitere Methoden (public slots): void settext(const QString &text); QString toplaintext() const; Auswahl vordefinierter Signale: void selectionchanged(); void textchanged(); Peter Sobe 20

Einzelne Klassen in Qt QTextEdit Beispiel eines einfachen Texteditors: #include <QApplication> #include <QTextEdit> QTextEdit *tedit = new QTextEdit(); // Setzen des Inhalts Qstring str; str.append(tr("das ist ein netter Text.")); tedit->settext(str); // Lesen und Weiterverarbeiten des Inhalts QByteArray asciistr; str = tedit->toplaintext(); asciistr = str.tolocal8bit(); Peter Sobe 21

Einzelne Klassen in Qt QCheckBox QCheckBox stellt eine einfache Auswahloption (angekreuzt oder nicht) mit einer typischerweise rechteckigen Box mit oder ohne Häkchen dar. #include <QCheckBox> QCheckBox *cb1 = new QCheckBox( Fensterplatz gewünscht ); QCheckBox *cb2 = new QCheckBox( Gepäck aufgeben ); cb2->setcheckstate(qt::checked); // Platzieren cb1 und cb1 in Window, Dialog oder Layout // Verbinden des Signals statechanged(int) mit einer Slot-Methode, die // z.b. von der Fensterklasse bereitgestellt wird connect(cb1, SIGNAL(stateChanged(int), this, SLOT(auswertung(int))); // void MyWindow::auswertung(int state) { if (state==qt::checked) fenster=true; else fenster=false; } Hier wird über die Siglnal- Slot-Verbindung ein Parameter (Typ int) übertragen. Peter Sobe 22

QRadioButton Einzelne Klassen in Qt QRadioButton stellt einen Knopf innerhalb einer Knopfgruppe dar, in der nur der zuletzt gesetzte ausgewählt ist (vgl. Radio-Knöpfe UKW/MW/LW) #include <QRadioButton> #include <QGroupBox> QGroupBox* group = new QGroupBox( Wellenbereiche ); QRadioButtion *rb1 = new QRadioButton( UKW ); QRadioButtion *rb2 = new QRadioButton( MW ); rb1->setchecked(true); QVBoxLayout *vbox= new QVBoxLayout; vbox->addwidget(rb1); vbox->addwidget(rb2); group->setlayout(vbox); QVBoxLayout *vvbox = new QVBoxLayout; vvbox-> addwidget(group); setlayout(vvbox); // Umgebendes Fenster nimmt hier die Knopf-Gruppe auf Jedes RadioButton-Objekt stellt eine Signal-Methode toggled(bool) bereit. Peter Sobe 23

Einzelne Klassen in Qt QFileDialog QFileDialog erlaubt die Auswahl eines Dateinamens zum Laden oder Speichern einer Datei. Der Dateiauswahldialog wird vom Betriebssystem (Windows) oder dem Fenstermanager (KDE/Linux) bereitgestellt. QString filename; QFileDialog *fdlg = new QFileDialog(this, Wählen Sie ); fdlg->setfilemode(qfiledialog::existingfiles); // if (fdlg->exec()) // exec() ergibt false, wenn Auswahl abgebrochen filename = fdlg->selectedfiles(); Peter Sobe 24

Static-Methoden Oft stellen Klassen Methoden bereit, die man auch ohne eine Instanziierung eines Objekt benutzen kann Beispiel: Qstring fn; fn = QFileDialog::getOpenFileName( Bitte Datei auswählen, Qdir::homePath(), Alle Dateien (*.*) ); // Weiterverarbeitung fn Peter Sobe 25

Static-Methoden Oft stellen Klassen Methoden bereit, die man auch ohne eine Instanziierung eines Objekt benutzen kann Beispiel: Qstring fn; fn = QFileDialog::getOpenFileName( Bitte Datei auswählen, Qdir::homePath(), Alle Dateien (*.*) ); // Weiterverarbeitung fn Peter Sobe 26

Static-Methoden class constants { public: static double e() { return 2.7182818284; } static double pi() { return 3.14159; } }; // eine 'normale' Methode double zweimal_pi_mal_freq(double f) { return 2.0 * constants::pi() *f;} Aufruf der Static-Methoden ohne Objekt: cout << "e="<<constants::e() << endl; cout << "pi="<<constants::pi() << endl; Aufruf normaler Methoden: constants ccc; double wert = ccc.zweimal_pi_mal_freq(120.55); Peter Sobe 27

Elementobjekte als Static Member Elementobjekte werden normalerweise in jedem Objekt instanziiert. Ein Beispiel ist die Klasse Linie mit zwei Punkt-Objekten. Static-Member: Ein als static deklariertes Elementobjekt führt zu einer einzigen gemeinsamen Instanz für alle Objekte einer Klasse. Beispiel einer Instanz-Nr., die unter allen Instanzen geteilt wird. class element { private: static int inr; }; element e1, e2, e3, e4; // Es entstehen vier Instanzen der Klasse element, aber nur eine Integer-Variable inr. Peter Sobe 28

Elementobjekte als Static Member class element { private: }; public: char bezeichung[100]; static int inr; element(char *bez) { strcpy(bezeichung, bez); inr++; } char * get_bezeichung() { return bezeichung;} static int get_instanz_nr(){ return inr;} int element::inr = 0; // ausserhalb der Klasse zu deklarieren Peter Sobe 29