Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Überblick über Python
3 Die Arbeit mit Python
4 Der interaktive Modus
5 Grundlegendes zu Python-Programmen
6 Kontrollstrukturen
7 Das Laufzeitmodell
8 Basisdatentypen
9 Benutzerinteraktion und Dateizugriff
10 Funktionen
11 Modularisierung
12 Objektorientierung
13 Weitere Spracheigenschaften
14 Mathematik
15 Strings
16 Datum und Zeit
17 Schnittstelle zum Betriebssystem
18 Parallele Programmierung
19 Datenspeicherung
20 Netzwerkkommunikation
21 Debugging
22 Distribution von Python-Projekten
23 Optimierung
24 Grafische Benutzeroberflächen
25 Python als serverseitige Programmiersprache im WWW mit Django
26 Anbindung an andere Programmiersprachen
27 Insiderwissen
28 Zukunft von Python
A Anhang
Stichwort

Download:
- ZIP, ca. 4,8 MB
Buch bestellen
Ihre Meinung?

Spacer
 <<   zurück
Python von Peter Kaiser, Johannes Ernesti
Das umfassende Handbuch - Aktuell zu Python 2.5
Buch: Python

Python
gebunden, mit CD
819 S., 39,90 Euro
Galileo Computing
ISBN 978-3-8362-1110-9
Pfeil 24 Grafische Benutzeroberflächen
  Pfeil 24.1 Toolkits
  Pfeil 24.2 Einführung in PyQt
    Pfeil 24.2.1 Installation
    Pfeil 24.2.2 Grundlegende Konzepte von Qt
  Pfeil 24.3 Entwicklungsprozess
    Pfeil 24.3.1 Erstellen des Dialogs
    Pfeil 24.3.2 Schreiben des Programms
  Pfeil 24.4 Signale und Slots
  Pfeil 24.5 Überblick über das Qt-Framework
  Pfeil 24.6 Zeichenfunktionalität
    Pfeil 24.6.1 Werkzeuge
    Pfeil 24.6.2 Koordinatensystem
    Pfeil 24.6.3 Einfache Formen
    Pfeil 24.6.4 Grafiken
    Pfeil 24.6.5 Text
    Pfeil 24.6.6 Eye-Candy
  Pfeil 24.7 Model-View-Architektur
    Pfeil 24.7.1 Beispielprojekt: Ein Adressbuch
    Pfeil 24.7.2 Auswählen von Einträgen
    Pfeil 24.7.3 Editieren von Einträgen
  Pfeil 24.8 Wichtige Widgets
    Pfeil 24.8.1 QCheckBox
    Pfeil 24.8.2 QComboBox
    Pfeil 24.8.3 QDateEdit
    Pfeil 24.8.4 QDateTimeEdit
    Pfeil 24.8.5 QDial
    Pfeil 24.8.6 QDialog
    Pfeil 24.8.7 QGLWidget
    Pfeil 24.8.8 QLineEdit
    Pfeil 24.8.9 QListView
    Pfeil 24.8.10 QListWidget
    Pfeil 24.8.11 QProgressBar
    Pfeil 24.8.12 QPushButton
    Pfeil 24.8.13 QRadioButton
    Pfeil 24.8.14 QScrollArea
    Pfeil 24.8.15 QSlider
    Pfeil 24.8.16 QTableView
    Pfeil 24.8.17 QTableWidget
    Pfeil 24.8.18 QTabWidget
    Pfeil 24.8.19 QTextEdit
    Pfeil 24.8.20 QTimeEdit
    Pfeil 24.8.21 QTreeView
    Pfeil 24.8.22 QTreeWidget
    Pfeil 24.8.23 QWidget


Galileo Computing - Zum Seitenanfang

24.8 Wichtige Widgets  Zur nächsten ÜberschriftZur vorigen Überschrift

Nachdem wir bereits zwei Beispielprojekte zur Programmierung grafischer Benutzeroberflächen in PyQt entwickelt haben, finden Sie in diesem Abschnitt eine Übersicht über die wichtigsten Qt-Widgets und ihre Verwendung. Wie Sie wissen, werden Widgets im Qt-Framework durch Klassen repräsentiert, die sogenannten Widgetklassen. Die Aufzählung von Widgetklassen, die Sie in diesem Kapitel vorfinden werden, ist keineswegs vollständig, und auch die Verwendung der Widgetklassen kann hier nicht erschöpfend beschrieben werden. Wenn Sie eine umfassende Beschreibung dieser Klassen benötigen, ist die Qt- bzw. PyQt-Dokumentation Ihr Freund und Helfer. Eine umfassende Übersicht über alle Klassen des Qt-Frameworks finden Sie dort unter dem Stichwort »class reference«.

Die folgende Übersicht ist in alphabetischer Reihenfolge geordnet.


Galileo Computing - Zum Seitenanfang

24.8.1 QCheckBox  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QCheckBox repräsentiert eine Check Box in der grafischen Benutzeroberfläche. Eine Check Box ist ein Steuerelement, das vom Benutzer entweder aktiviert oder deaktiviert werden kann und dabei in seiner Bedeutung unabhängig von anderen Check Boxes ist. Eine Alternative zur Check Box ist der Radio Button, der in Abschnitt 24.8.13 erklärt wird.

Abbildung 24.31  Zwei Check Boxes

Die Verwendung der Klasse QCheckBox ist aufgrund der einfachen Struktur des Steuerelements schnell erklärt. Sie können mit den Methoden setCheckState und checkState den sogenannten Check State setzen oder lesen. Der Check State beschreibt, ob die Check Box momentan mit einem Haken versehen ist oder nicht. Dabei werden folgende Konstanten verwendet, wobei setCheckState eine solche Konstante als Parameter erwartet und checkState eine dieser Konstanten zurückgibt.


Tabelle 24.9  Lokale Referenzen in der Methode paint
Attribut Beschreibung
QtCore.Qt.Checked

Die Check Box zeigt einen Haken.

QtCore.Qt.Unchecked

Die Check Box zeigt keinen Haken.

QtCore.Qt.PartiallyChecked

Die Check Box befindet sich im optionalen dritten Modus: »teilweise gecheckt«.


Eine Check Box kann mithilfe der Methode setTristate mit dem in der Tabelle genannten optionalen dritten Status versehen werden.

Abbildung 24.32  Eine Check Box im optionalen dritten Status

Diesen dritten Status kennen Sie beispielsweise von der »Schreibgeschützt«-Check Box im Ordnereigenschaften-Dialog von Windows. Sie zeigt an, dass die Option für einen Teil der untergeordneten Elemente aktiv und für den anderen Teil inaktiv ist. Den Tristate-Status können Sie mit der Methode isTristate abfragen.

Wenn der Benutzer den Status einer Check Box ändert, wird das stateChanged-Signal gesendet, das die Signatur stateChanged(int) besitzt.


Galileo Computing - Zum Seitenanfang

24.8.2 QComboBox  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QComboBox repräsentiert eine Combo Box, besser bekannt als Dropdown-Menü, in der grafischen Benutzeroberfläche.

Abbildung 24.33  Zwei Combo Boxes

Zunächst einmal können einer QComboBox-Instanz mithilfe der Methode addItem bzw. addItems Einträge hinzugefügt werden. Diese Methoden bekommen einen String bzw. eine Liste von Strings übergeben, die jeweils den Namen des Eintrags enthalten, der in der Combo Box erscheinen soll. Der Methode addItem kann zudem optional eine QIcon-Instanz an erster Stelle übergeben werden, die das Icon repräsentiert, das zusammen mit dem Eintrag in der Combo Box angezeigt werden soll.

Wenn der Benutzer einen Eintrag einer Combo Box auswählt, werden zwei Signale gesendet: currentIndexChanged(int) und activated(int). Der Unterschied zwischen diesen beiden Signalen besteht darin, dass currentIndex Changed auch gesendet wird, wenn vonseiten des Programms, also ohne Eingriff des Benutzers, ein Eintrag ausgewählt wurde, während activated ausschließlich dann gesendet wird, wenn der Benutzer einen Eintrag der Combo Box auswählt.

Eine Combo Box kann klassisch, beispielsweise mit der oben beschriebenen Methode addItem, mit Werten gefüllt werden, unterstützt aber auch eine Model-View-Architektur. Dazu kann mithilfe der Methoden setModel und setView der QComboBox-Klasse die Modell- bzw. die Viewklasse festgelegt werden.


Galileo Computing - Zum Seitenanfang

24.8.3 QDateEdit  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QDateEdit repräsentiert ein Widget in der grafischen Benutzeroberfläche, das eine Datumsangabe vom Benutzer einliest. Dabei ist es mit dem DateEdit-Widget möglich, dem Benutzer einen übersichtlichen Kalender anzuzeigen, in dem er das gewünschte Datum auswählen kann.

Abbildung 24.34  Zwei DateEdit-Widgets

Bei der Instanziierung der Klasse QDateEdit kann als erster Parameter eine QDate-Instanz übergeben werden, die dem Datum entspricht, das im Widget voreingestellt sein soll. Anstelle von QDate kann auch eine Instanz der Klasse date time.date aus Pythons Standardbibliothek übergeben werden.

Das Anzeigen eines Kalenders kann durch Aufruf der Methode setCalendar Popup aktiviert werden, indem beim Methodenaufruf True übergeben wird.

Über die Methoden setMinimumDate und setMaximumDate kann dem Benutzer ein bestimmter Zeitraum vorgegeben werden, aus dem er ein Datum auswählen soll. Diese Werte können dementsprechend über die Methoden minimumDate und maximumDate ausgelesen werden. Beachten Sie, dass die beiden letzten Methoden das jeweilige Datum als QDate-Instanz zurückgeben. Das Datum, das momentan vom Widget angezeigt wird, kann mithilfe der Methode date gelesen und mit setDate geschrieben werden.

Wenn das Datum vom Benutzer geändert wurde, wird vom DateEdit-Widget das Signal dateChanged(const QDate &) gesendet.

Beachten Sie, dass neben dem DateEdit-Widget noch das DateTimeEdit- und das TimeEdit-Widget existieren, bei denen der Benutzer noch zusätzlich bzw. ausschließlich eine Uhrzeit angeben kann.


Galileo Computing - Zum Seitenanfang

24.8.4 QDateTimeEdit  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QDateTimeEdit repräsentiert ein Widget, das sich ganz ähnlich verhält wie das DateEdit-Widget, mit dem Unterschied aber, dass zusätzlich zum Datum eine Uhrzeit angegeben werden kann. Ähnlich wie beim DateEdit-Widget kann optional ein Kalender zum Auswählen des Datums angezeigt werden. Zum Auswählen der Uhrzeit existiert keine solche Komfortfunktion, sie muss durch den Benutzer eingetippt werden.

Abbildung 24.35  Zwei DateTimeEdit-Widgets

Bei der Klasse QDateTimeEdit handelt es sich genauer betrachtet um die Basisklasse von QDateEdit. Die Verwendung von QDateTimeEdit ähnelt also der Verwendung von QDateEdit sehr. Um die Zeitangabe verwerten zu können, existieren zusätzlich zu den bei QDateEdit besprochenen Methoden die Methoden setMinimumTime, setMaximumTime, setTime, minimumTime, maximumTime und time mit den Bedeutungen für die Zeitangabe, die die jeweiligen Datumsäquivalente für die Datumsangabe haben. Beachten Sie analog zu den Datumsmethoden, dass Qt die Klasse QTime für Zeitangeben verwendet.

Neben dem Signal dateChanged(const QDate &) [Das Signal wurde mit seiner C++-Parametersignatur angegeben. Diese muss zum einen beim Verbinden eines Slots zu diesem Signal angegeben werden und gibt zum anderen Aufschluss über die Anzahl und Typen der Parameter, die einem verbundenen Slot übergeben werden. ] , das bei einer Änderung des Datums gesendet wird, existieren die Signale timeChanged(const QTime &) sowie dateTimeChanged(const QDateTime &), die bei einer Änderung der Zeit bzw. in beiden Fällen gesendet werden.


Galileo Computing - Zum Seitenanfang

24.8.5 QDial  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QDial repräsentiert ein sogenanntes Dial-Widget in der grafischen Benutzeroberfläche. Ein Dial-Widget ist eine Art Drehregler ähnlich dem Lautstärkeregler einer Stereoanlage.

Abbildung 24.36  Zwei Dial-Widgets

Das Dial-Widget wird intern ganz ähnlich angesprochen wie ein sogenanntes Slider-Widget, das einen Schieberegler repräsentiert. Beide Widgets erben von derselben Basisklasse, QAbstractSlider.

Der einzige Unterschied zwischen einem Slider und dem Dial-Widget ist das sogenannte Wrapping des Dial-Widgets. Dieser Modus ist standardmäßig deaktiviert und bedeutet, dass übergangslos zwischen dem ersten und dem letzten möglichen Wert gewechselt werden kann. Wenn das Wrapping deaktiviert ist, besteht zwischen dem ersten und dem letzten Wert eine Lücke. In Abbildung 24.36 ist das an den Strichen deutlich zu sehen. Eine Einsatzmöglichkeit für den Wrapping-Modus wäre ein Dial-Widget, bei dem ein Winkel in Grad angegeben werden soll. Dabei sollte übergangslos zwischen 0° und 359° gewechselt werden können.

Der Wrapping-Modus kann mithilfe der Methode setWrapping aktiviert bzw. deaktiviert und mithilfe der Methode wrapping ausgelesen werden.

Näheres zur Verwendung des Dial-Widgets erfahren Sie in Abschnitt 24.8.19, in dem das Slider-Widget besprochen wird.


Galileo Computing - Zum Seitenanfang

24.8.6 QDialog  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QDialog repräsentiert einen Dialog in der grafischen Benutzeroberfläche. Ein Dialog unterscheidet sich von normalen Widgets dahingehend, dass ein Dialog immer ein sogenanntes Toplevel-Widget ist, sich also nicht in ein anderes Widget einbetten lässt. Abgesehen von diesem Unterschied, kann QDialog wie eine Widgetklasse verwendet werden, da sie, wie alle Widgets, von der Basisklasse QWidget abgeleitet ist. Eine QDialog-Instanz kann verwendet werden, um im wahrsten Sinne des Wortes einen Dialog mit dem Benutzer zu führen, beispielsweise um gewisse Daten von diesem einzulesen.

Grundsätzlich unterscheidet man zwei Arten von Dialogen – modale und nicht modale Dialoge:

  • Unter einem modalen Dialog versteht man einen Dialog, der sich im Vordergrund der Anwendung platziert und sich den Eingabefokus klaut. Es können keine anderen Dialoge vom Benutzer bedient werden, während ein modaler Dialog geöffnet ist. Ein modaler Dialog bietet sich also für eine wichtige Teilkommunikation mit dem Benutzer an, die für den weiteren Programmlauf essenziell ist.
  • Dem gegenüber steht der nicht modale Dialog. Wird ein Dialog nicht modal geöffnet, so kann er parallel zum restlichen Teil der Anwendung bedient werden. Ein bekanntes Beispiel für einen nicht modalen Dialog ist der »Suchen und Ersetzen«-Dialog von vielen Textverarbeitungsprogrammen, bei dem es dem Benutzer möglich sein muss, während des geöffneten Dialogs Änderungen im Hauptfenster vorzunehmen.

Um einen Dialog modal anzuzeigen, wird die Methode exec aufgerufen. Diese blockiert den Programmfluss so lange, bis der Benutzer den Dialog beendet hat. Der Rückgabewert von exec gibt an, in welcher Form der Dialog beendet wurde. Es wird eine der beiden Konstanten QtCore.Qt.Accepted und QtCore.Qt.Rejec ted zurückgegeben, wobei die erste ein Beenden des Dialogs über den OK- und die zweite ein Beenden über den Abbrechen-Button repräsentiert. Innerhalb der Dialogklasse können die Methoden accept und reject aufgerufen werden, um den Dialog mit dem entsprechenden Rückgabewert zu beenden.

Ein nicht modaler Dialog wird mithilfe der Methode show angezeigt. Diese Methode kehrt sofort zurück, ohne auf das Beenden des Dialogs zu warten, und ermöglicht somit das parallele Verarbeiten von Dialog und Hauptanwendung.


Galileo Computing - Zum Seitenanfang

24.8.7 QGLWidget  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QGLWidget repräsentiert ein Widget in der grafischen Benutzeroberfläche, das eine 3D OpenGL-Szene anzeigt. Auf diese Weise kann Qt beispielsweise als Benutzeroberfläche für ein Computerspiel oder für einen Editor für dreidimensionale Daten verwendet werden. Die Klasse QGLWidget ist zwar sehr interessant und bietet eine Fülle von Möglichkeiten, liegt aber auch nicht im Fokus dieses Buches und soll deshalb hier nur der Vollständigkeit halber erwähnt werden. Näheres zum GL-Widget finden Sie in der Qt- bzw. PyQt-Dokumentation.


Galileo Computing - Zum Seitenanfang

24.8.8 QLineEdit  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QLineEdit repräsentiert ein LineEdit-Widget in der grafischen Benutzeroberfläche. Ein LineEdit-Wdiget ermöglicht es, einen einzeiligen Text vom Benutzer einzulesen. Ein LineEdit-Widget kann optional sowohl lese- als auch schreibgeschützt sein, sodass beispielsweise auch eine Passworteingabe mit der Klasse QLineEdit realisiert werden kann.

Abbildung 24.37  Drei LineEdit-Widgets

Die Verwendung des Eingabefeldes ist recht einfach und basiert im Wesentlichen auf den Methoden setText und text, mit denen der enthaltene Text geschrieben bzw. ausgelesen werden kann.

Zusätzlich kann ein LineEdit-Eingabefeld (wie in Abbildung 24.37 zu sehen ist) in verschiedene Modi versetzt werden:

  • Im normalen Modus kann der enthaltene Text sowohl vom Benutzer als auch vom Programm verändert und gelesen werden.
  • Im schreibgeschützten Modus kann der enthaltene Text vom Benutzer zwar gelesen, aber nicht verändert werden. Für das Programm selbst ist das Eingabefeld dann selbstverständlich nicht schreibgeschützt.
  • Im lesegeschützten Modus kann der enthaltene Text vom Benutzer zwar geschrieben, aber nicht gelesen werden. Das ist insbesondere für Passworteingaben interessant. Das Programm selbst kann selbstverständlich auch ein lesegeschütztes Feld auslesen.

Um ein LineEdit-Widget schreibgeschützt zu schalten, muss die Methode setReadOnly aufgerufen und True übergeben werden. Um den Wert auszulesen, kann die Methode readOnly aufgerufen werden. Um ein LineEdit-Widget lesegeschützt zu schalten, muss die Methode setEchoMode aufgerufen und eine der folgenden Konstanten übergeben werden:


Tabelle 24.10  Eingabemodi eines LineEdit-Widgets
Attribut Beschreibung
QtGui.QLineEdit.Normal

Aktiviert den normalen Eingabemodus.

QtGui.QLineEdit.NoEcho

Aktiviert einen lesegeschützten Eingabemodus, bei dem überhaupt nichts angezeigt wird.

QtGui.QLineEdit.Password

Aktiviert einen lesegeschützten Eingabemodus, bei dem jeder eingegebene Buchstabe durch einen dicken Punkt ersetzt wird.



Galileo Computing - Zum Seitenanfang

24.8.9 QListView  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QListView repräsentiert ein ListView-Widget in der grafischen Benutzeroberfläche. Ein ListView-Widget zeigt die Daten einer entsprechenden Modellklasse in Form einer Liste an. Üblicherweise wird ein eigenes Widget erstellt, das von der Klasse QListView abgeleitet wird, um die Art der Anzeige anzupassen. Eine Einführung in das Konzept der Modell-View-Programmierung anhand des ListView-Widgets finden Sie in Abschnitt 24.7.


Galileo Computing - Zum Seitenanfang

24.8.10 QListWidget  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QListWidget repräsentiert ein List-Widget in der grafischen Benutzeroberfläche. Ein List-Widget dient einem ähnlichen Zweck wie das ListView-Widget, nämlich dazu, aufbereitete Daten in Form einer Liste anzuzeigen. Der Unterschied besteht darin, dass für QListView keine Modell-View-Architektur erforderlich ist.

Abbildung 24.38  Ein List-Widget

Ein List-Widget wird immer dann eingesetzt, wenn das Erstellen einer Model-View-Architektur für die anzuzeigenden Daten unverhältnismäßig aufwendig wäre und die Flexibilität, die eine Model-View-Architektur bietet, nicht benötigt wird.

Ein einzelner Eintrag in der Liste wird durch eine Instanz der Klasse QListWidget Item repräsentiert, die mithilfe der Methode addItem zur Liste hinzugefügt werden kann. Die Methode currentItem gibt den momentan ausgewählten Eintrag zurück.


Galileo Computing - Zum Seitenanfang

24.8.11 QProgressBar  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QProgressBar repräsentiert einen Fortschrittsbalken (engl. progress bar) in einer grafischen Benutzeroberfläche. Ein Fortschrittsbalken zeigt den Fortschritt einer langwierigen Operation an. Der Benutzer kann dabei aus naheliegenden Gründen keine Eigenschaften des Fortschrittsbalkens verändern; das ProgressBar-Widget ist für den Benutzer ausschließlich lesbar.

Abbildung 24.39  Vier ProgressBar-Widgets

Einem ProgressBar-Widget wird keine Prozentzahl übergeben, die es anzuzeigen hat, sondern es wird auf der Basis von Einzelschritten gearbeitet. Mithilfe der Methoden setMinimum und setMaximum wird ein ganzzahliger Bereich festgelegt, in dem sich der momentane Status bewegt. Mit setValue wird dem ProgressBar-Widget der aktuelle, ebenfalls ganzzahlige Status mitgeteilt, der zwischen dem angegebenen Minimum und dem Maximum liegen muss. Das Widget errechnet daraus eine Prozentzahl und zeigt den Fortschrittsbalken dementsprechend an.

Wenn sowohl das Minimum als auch das Maximum auf 0 gesetzt wurden, zeigt die ProgressBar den sogenannten Busy Indicator an. Das ist ein kurzes Stück des Fortschrittsbalkens, das im Widget hin- und herläuft (siehe Abbildung 24.40).

Abbildung 24.40  Der Busy Indicator

Optional kann der Fortschritt zusätzlich zum Balken in Form einer Prozentanzeige visualisiert werden. Dazu muss die Methode setTextVisible aufgerufen und True übergeben werden.

Ein ProgressBar-Widget kann, wie in Abbildung 24.39 zu sehen ist, entweder horizontal oder vertikal verlaufen. Um diese Eigenschaft an die jeweiligen Umstände anzupassen, wird die Methode setOrientation mit einer der beiden Konstanten QtCore.Qt.Horizontal bzw. QtCore.Qt.Vertical als Parameter aufgerufen.


Galileo Computing - Zum Seitenanfang

24.8.12 QPushButton  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QPushButten repräsentiert einen Button, auch Schaltfläche genannt, in der grafischen Benutzeroberfläche. Ein Button ist ein beschriftetes Widget, auf das der Benutzer klicken kann, um eine mit dem Button assoziierte Aktion auszulösen.

Abbildung 24.41  Drei PushButton-Widgets

Die häufigste Art des Buttons ist die, die in Abbildung 24.41 mit »Klick mich« beschriftet ist. Auf diese Weise präsentiert sich ein PushButton-Widget im Normalfall. Die Beschriftung des Buttons kann mit der Methode setText festgelegt werden.

Das Einzige, was zur Verwendung des Buttons noch fehlt, ist das Signal, das beim Klicken auf selbigen gesendet wird. Dabei handelt es sich um das clicked()-Signal. Das Programm sollte einen Slot mit diesem Signal verbinden, um eine Aktion beim Klicken des Buttons zu starten.

Eine Variante des Push Buttons ist der Toggle Button. Das ist ein Button, der sich ähnlich wie eine Check Box aktivieren und deaktivieren lässt. Ein solcher Button ist in Abbildung 24.41 zu sehen und mit »Check mich« beschriftet. Der Toggle-Modus wird aktiviert, indem die Methode setCheckable der Klasse QPushButton aufgerufen und True übergeben wird. Dann kann der Status des Buttons, ähnlich wie der einer Check Box, mit der Methode isChecked herausgefunden und mittels setCheck gesetzt werden.

Zu guter Letzt kann ein Button durch Aufruf der Methoden setDafault noch zu einem sogenannten Default Button gemacht werden. Ein solcher Button wird immer dann aktiviert, wenn der Benutzer auf die Return- oder Leertaste drückt, egal, welches Steuerelement momentan den Fokus hat. Der Default Button wird hervorgehoben. Es kann in einem Dialog immer nur einen solchen Button geben.


Galileo Computing - Zum Seitenanfang

24.8.13 QRadioButton  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QRadioButton repräsentiert einen Radio Button in der grafischen Benutzeroberfläche. Ein Radio Button wird verwendet, um den Benutzer eine Auswahl aus mehreren vorgegebenen Möglichkeiten treffen zu lassen.

Abbildung 24.42  Drei Radio Buttons

Alle Radio Buttons eines Dialogs, die über dasselbe Elternwidget verfügen, gehören zu einer Gruppe. Innerhalb einer Gruppe kann immer nur ein Radio Button aktiviert sein. Wenn der Benutzer einen anderen aktiviert, wird der vorher aktivierte inaktiv. Um mehrere Gruppen von Radio Buttons in demselben Dialog unterzubringen, müssen diese über verschiedene Elternwidgets verfügen. Dazu bietet sich das sogenannte Frame-Widget, repräsentiert durch die Klasse QFrame, an, das einem unsichtbaren Rahmen im Widget entspricht und als Elternwidget für die Radio Buttons dienen kann.

Ein Radio Button sendet das Signal toggled(), wenn der Benutzer ihn aktiviert oder deaktiviert. Ansonsten kann der Status eines Radio Buttons, ähnlich wie bei einer Check Box, über die Methode isChecked erfragt werden.


Galileo Computing - Zum Seitenanfang

24.8.14 QScrollArea  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QScrollArea repräsentiert ein ScrollArea-Widget in der grafischen Benutzeroberfläche. Ein ScrollArea-Widget besitzt ein untergeordnetes Widget, dessen Größe möglicherweise die Größe des ScrollArea-Widgets überschreitet. Wenn dies der Fall ist, sorgt das ScrollArea-Widget dafür, dass Scrollbars für die entsprechende Seite entstehen, mit deren Hilfe das übergroße untergeordnete Widget gescrollt werden kann.

Abbildung 24.43  Ein ScrollArea-Widget

Das untergeordnete Widget einer QScrollArea-Instanz wird mithilfe der Methode setWidget festgelegt. In Abbildung 24.43 wurde dem ScrollArea-Widget ein zugegebenermaßen ungewöhnlich großes Dial-Widget zum Scrollen übergeben.


Galileo Computing - Zum Seitenanfang

24.8.15 QSlider  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QSlider repräsentiert einen Slider in der grafischen Benutzeroberfläche. Bei einem Slider handelt es sich um einen Schieberegler, wie Sie ihn beispielsweise von einem Mischpult her kennen. Grundsätzlich wird ein Slider dazu verwendet, den Benutzer einen ganzzahligen Wert auswählen zu lassen, der innerhalb eines bestimmten Bereichs liegen muss. Dabei sollte der tatsächliche Wert für den Benutzer eher weniger interessant sein, da dieser von einem Slider nicht angezeigt wird.

Abbildung 24.44  Drei Slider

Der Slider ist von der Basisklasse QAbstractSlider abgeleitet, von der auch das Dial-Widget erbt. Die Verwendung dieser beiden Widgets ist weitestgehend identisch.

Ein Slider wird durch Aufruf der Methoden setMinimum und setMaximum initialisiert. Diese Methoden legen den ganzzahligen Mindest- bzw. Maximalwert fest, zwischen denen der Benutzer einen beliebigen Wert wählen darf. Mithilfe der Methode setValue kann der Anfasser des Sliders auf eine bestimmte Position gesetzt werden. Analog dazu erlaubt es die Methode value, die Position des Anfassers auszulesen. Der Slider sendet das Signal valueChanged() immer dann, wenn der Benutzer den Anfasser auf eine neue Position bewegt und losgelassen hat.

Optional kann ein Slider mit einer Skala ausgestattet werden. Dazu muss die Methode setTickPosition mit einem geeigneten Parameter aufgerufen werden. Als Parameter kann beispielsweise QtCore.Qt.NoTicks übergeben werden, um eine Skala abzuschalten, oder QtCore.Qt.TicksAbove bzw. QtCore.Qt.Ticks Below, um die Skala über bzw. unter dem Slider anzuzeigen.

Zu guter Letzt kann ein Slider, wie in Abbildung 24.44 zu sehen ist, sowohl horizontal als auch vertikal ausgerichtet sein. Um die Ausrichtung eines Sliders zu verändern, wird die Methode setOrientation aufgerufen und eine der beiden Konstanten QtCore.Qt.Horizontal bzw. QtCore.Qt.Vertical übergeben.


Galileo Computing - Zum Seitenanfang

24.8.16 QTableView  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QTableView repräsentiert ein TableView-Widget in der grafischen Benutzeroberfläche. Ein TableView Widget zeigt tabellarische Datenstrukturen, beispielsweise die Bundesliga-Tabelle, unter Verwendung einer Model-View-Architektur an.

Ein Beispiel für eine Model-View-Architektur, allerdings bezogen auf ein ListView-Widget, finden Sie in Abschnitt 24.7. Sie können QTableView als View- und beispielsweise QAbstractTableModel als Modellklasse verwenden. Genauere Informationen und Beispiele zu diesem Thema sind in der Qt-Dokumentation zu finden.


Galileo Computing - Zum Seitenanfang

24.8.17 QTableWidget  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QTableWidget repräsentiert ein Table-Widget in der grafischen Benutzeroberfläche. Ein Table Widget hat einen ähnlichen Zweck wie ein TableView-Widget, mit dem Unterschied aber, dass das Table Widget keine Model-View-Architektur voraussetzt.

Abbildung 24.45  Ein Table-Widget

Das Table-Widget wird besonders dann eingesetzt, wenn das Schreiben einer eigenen Model-View-Architektur unverhältnismäßig viel Arbeit bedeutet und die Flexibilität, die eine solche Architektur bietet, nicht benötigt wird.

Nachdem eine Instanz der Klasse QTableWidget erzeugt wurde, können mithilfe der Methoden setRowCount und setColumnCount die Anzahl der Zeilen und Spalten festgelegt werden. Danach können einzelne Einträge in jeweils eine Zelle der Tabelle geschrieben werden. Um einen Eintrag hinzuzufügen, wird die Methode setItem aufgerufen, die den Zeilen- und Spaltenindex der Zelle und eine QTable WidgetItem-Instanz übergeben bekommt. Diese Instanz beschreibt das einzufügende Element.

Die Zeilen und Spalten einer Tabelle können mithilfe der Methoden setHorizon talHeaderLabels und setVerticalHeaderLabels beschriftet werden. Diese Methoden bekommen jeweils eine Liste von Strings als Parameter übergeben.


Galileo Computing - Zum Seitenanfang

24.8.18 QTabWidget  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QTabWidget repräsentiert ein Tab-Widget in der grafischen Benutzeroberfläche. Ein Tab-Widget zeigt mehrere Karteikartenreiter an, zwischen denen der Benutzer wechseln kann. Je nachdem, welcher Reiter aktiv ist, werden unterschiedliche Steuerelemente im Tab-Widget angezeigt. Das Tab-Widget findet häufig in Konfigurationsdialogen Anwendung, wenn viele Steuerelemente auf relativ wenig Raum einfach zu erreichen sein müssen.

Abbildung 24.46  Tab-Widget im Konfigurationsdialog eines fiktiven Spiels

Nachdem eine Instanz der Klasse QTabWidget erzeugt worden ist, können die einzelnen Tabs und die dazugehörenden sogenannten Seiten erstellt werden. Eine Seite ist nichts anderes als ein Widget, dem die in der Seite gewünschten Steuerelemente untergeordnet sind. Beachten Sie, dass das Seitenwidget kein Elternwidget benötigt. Mithilfe der Funktion addTab wird ein Tab mitsamt Seite zum Tab-Widget hinzugefügt.

Auf die aktuell angezeigte Seite kann mithilfe der Methoden currentIndex oder currentWidget zugegriffen werden. Analog dazu kann die aktuelle Seite mit setCurrentIndex bzw. setCurrentWidget verändert werden.

Wenn der Benutzer eine neue Seite auswählt, wird das Signal currentChan ged(int) gesendet.


Galileo Computing - Zum Seitenanfang

24.8.19 QTextEdit  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QTextEdit repräsentiert ein mehrzeiliges Eingabefeld in der grafischen Benutzeroberfläche. In ein solches Eingabefeld kann der Benutzer beliebigen Text schreiben.

Abbildung 24.47  Zwei TextEdit-Widgets

Ein TextEdit-Widget liegt nicht nur in der Vorstellung sehr nahe beim bereits besprochenen LineEdit-Widget, sondern wird programmintern auch ganz ähnlich angesprochen. Im Gegensatz zum einzeiligen Eingabefeld ist das TextEdit-Widget dazu in der Lage, Rich Text und HTML darzustellen.

Im Falle von reinem Text, wenn es sich also weder um HTML noch um Rich Text handelt, kann der Inhalt eines TextEdit-Widgets mit der Methode toPlainText ausgelesen und mittels setPlainText geschrieben werden. Außerdem kann das TextEdit-Widget ähnlich wie bei LineEdit durch Aufruf der Methode setRead Only in einen schreibgeschützten Modus versetzt werden, in dem der Benutzer den Inhalt des Widgets nicht verändern kann.

Das TextEdit-Widget bietet insbesondere in puncto HTML und Rich Text eine Fülle von Möglichkeiten, die in der Qt-Dokumentation im Detail besprochen werden.


Galileo Computing - Zum Seitenanfang

24.8.20 QTimeEdit  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QTimeEdit repräsentiert ein TimeEdit-Widget in der grafischen Benutzeroberfläche. Ein solches Widget erlaubt es, eine Zeitangabe vom Benutzer einzulesen. Die Klasse hängt eng mit den bereits besprochenen Klassen QDateEdit und QDateTimeEdit zusammen.

Abbildung 24.48  Ein TimeEdit-Widget

Die Klasse QTimeEdit unterstützt die Funktionalität der Klasse QDateTimeEdit, die sich auf Zeitangaben bezieht.


Galileo Computing - Zum Seitenanfang

24.8.21 QTreeView  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QTreeView repräsentiert ein TreeView-Widget in der grafischen Benutzeroberfläche. Ein TreeView-Widget zeigt baumförmige Datenstrukturen, beispielsweise den Inhalt eines Ordners mitsamt Unterordnern, unter Verwendung einer Model-View-Architektur an.

Ein Beispiel für eine Model-View-Architektur, allerdings bezogen auf ein ListView-Widget, finden Sie in Abschnitt 24.7. Dabei können Sie QTreeView als View- und beispielsweise QAbstractItemModel als Modellklasse verwenden. Genauere Informationen und Beispiele zu diesem Thema sind in der Qt-Dokumentation zu finden.


Galileo Computing - Zum Seitenanfang

24.8.22 QTreeWidget  Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klasse QTreeWidget repräsentiert ein Tree-Widget in der grafischen Benutzeroberfläche. Das Tree-Widget zeigt, ähnlich wie das TreeView-Widget, hierarchisch aufgebaute Datenstrukturen an. Im Gegensatz zum TreeView-Widget setzt das Tree-Widget jedoch keine Model-View-Architektur voraus.

Abbildung 24.49  Ein Tree-Widget

Die Klasse QTreeWidget implementiert die klassische Schnittstelle eines Tree-Widgets, die so ähnlich auch in vielen anderen GUI-Toolkits vorhanden ist. Allgemein sollte das Tree-Widget nur dann verwendet werden, wenn das Erstellen einer eigenen Model-View-Architektur einen unverhältnismäßig hohen Aufwand darstellt und auf die Flexibilität des TreeView-Widgets verzichtet werden kann.

Nach dem Instanziieren der Klasse QTreeWidget kann eine optionale Kopfzeile eingerichtet werden, die die Spaltenbeschreibungen enthält. In Abbildung 24.49 kennzeichnet die Kopfzeile die Spalten »Land« und »Einwohnerzahl«. Zum Anlegen einer Kopfzeile und zum Beschriften der Spalten wird die Methode setHea derLabels aufgerufen. Diese bekommt eine Liste von Strings übergeben und legt für jeden der enthaltenen Strings eine eigene Spalte im Tree-Widget an.

Nachdem das Widget initialisiert wurde, kann mithilfe der Methode addTop LevelItem ein Eintrag auf höchster Ebene hinzugefügt werden. Bei einem Eintrag handelt es sich um eine Instanz der Klasse QTreeWidgetItem, die ihrerseits über untergeordnete Einträge verfügen kann. Beim Instanziieren eines Eintrags wird dem Konstruktor der gewünschte Elterneintrag übergeben und die Baumstruktur auf diese Weise erzeugt. Wenn die Einträge erstellt wurden, kann der oberste Eintrag mittels addTopLevelItem zum Tree-Widget hinzugefügt werden, was alle untergeordneten Einträge einschließt.


Galileo Computing - Zum Seitenanfang

24.8.23 QWidget  topZur vorigen Überschrift

Die Klasse QWidget ist die Basisklasse aller Steuerelemente und implementiert einen Großteil der steuerelementübergreifenden Funktionalität. Allgemein können Widgets in zwei Sorten unterteilt werden:

  • Der häufigste Fall ist ein untergeordnetes Widget, das dadurch charakterisiert ist, dass es ein übergeordnetes Widget (Parent) besitzt. Ein solches untergeordnetes Widget wird relativ zu seinem Parent positioniert und kann nicht über die Ränder des Parent-Widgets hinausgehen.
  • Ein Widget ohne Parent-Widget ist ein sogenanntes Fenster (engl. Window). Theoretisch kann jede Instanz einer von QWidget abgeleiteten Klasse als Fenster dienen, beispielsweise also auch ein Button oder eine Check Box. Praktisch macht dies jedoch wenig Sinn, und es werden nur geeignetere Klassen wie beispielsweise QDialog als Fenster verwendet.

In diesem Kapitel soll ein knapper Überblick über die Funktionalität gegeben werden, die die Klasse QWidget bereitstellt und die demzufolge an jedes Steuerelement weitervererbt wird. Beachten Sie dabei, dass es sich bei QWidget um eine ausgesprochen umfangreiche Klasse handelt, die hier keinesfalls vollständig beschrieben werden kann.

Die folgende Tabelle listet die wichtigsten Eventhandler auf, die beim Auftreten verschiedener Events aufgerufen werden. Ein Eventhandler kann eingerichtet werden, indem eine selbst erstellte Klasse, die von QWidget direkt oder von einer Steuerelementklasse erbt, die genannte Methode implementiert.


Tabelle 24.11  Events eines Widgets
Event Beschreibung
paintEvent

Wird immer dann aufgerufen, wenn das Widget neu gezeichnet werden muss. Die Methode bekommt eine Instanz der Klasse QPaintEvent übergeben, die beispielsweise den neu zu zeichnenden Bereich enthält.

resizeEvent

Wird immer dann aufgerufen, wenn das Widget in seiner Größe verändert wurde. Der Methode wird eine Instanz der Klasse QResizeEvent übergeben, die unter anderem die alte und neue Größe des Widgets enthält.

mousePressEvent

Wird immer dann aufgerufen, wenn der Benutzer mit der Maus auf das Widget klickt. Der Methode wird eine Instanz der Klasse QMouseEvent übergeben, die beispielsweise die Koordinaten des Mausklicks enthält.

mouseDoubleClickEvent

Wird immer dann aufgerufen, wenn der Benutzer doppelt auf das Widget klickt. Beachten Sie, dass vor diesem Event immer ein mousePressEvent, ein mouseReleaseEvent und möglicherweise ein mouseMoveEvent auftreten. Es ist aus naheliegenden Gründen nicht möglich, bereits beim ersten Klick zwischen einem einfachen und einem doppelten Klick zu unterscheiden.

Es wird eine QMouseEvent-Instanz übergeben.

mouseMoveEvent

Wird immer dann aufgerufen, wenn der Benutzer die Maus bewegt, während er eine Maustaste gedrückt hält. Wenn zuvor die Methode setMouseTracking aufgerufen und True übergeben wurde, wird auch dann ein mouseMoveEvent erzeugt, wenn der Benutzer die Maus bewegt, ohne eine Taste gedrückt zu halten.

keyPressEvent

Wird immer dann aufgerufen, wenn das Widget den Eingabefokus hat und der Benutzer eine Taste drückt. Wenn die Taste ausreichend lange gedrückt wird, wird die Methode keyPressEvent immer wieder aufgerufen. Diese Funktionalität wird auto-repeat genannt.

Es wird eine Instanz der Klasse QKeyEvent übergeben, über die beispielsweise die gedrückte Taste ausgelesen werden kann.


Und damit beschließen wir das Kapitel über die Programmierung grafischer Benutzeroberflächen und wenden uns einem weiteren interessanten Themenkomplex zu: der Webentwicklung mit Python.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






 <<   zurück
  
  Zum Katalog
Zum Katalog: Python






Python
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Linux






 Linux


Zum Katalog: Ubuntu GNU/Linux






 Ubuntu GNU/Linux


Zum Katalog: Praxisbuch Web 2.0






 Praxisbuch Web 2.0


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Praxisbuch Objektorientierung






 Praxisbuch Objektorientierung


Zum Katalog: Einstieg in SQL






 Einstieg in SQL


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de