Login
Newsletter
Werbung

So, 2. April 2006, 00:00

Entwicklung von Applikationen in Qt 4.0, Teil 2

In diesem Teil geht es um den Entwicklungsprozess einer größeren Applikation.

Vorbemerkungen

In der ersten Folge des Workshops haben wir die Basisbegriffe kennengelernt, die zum Schreiben von Applikationen in Qt notwendig sind. Dies waren die Klassen QObject und QWidget sowie die darin eingebauten Signal- und Slot- sowie Ereignis- und Zeichnungsmechanismen. In diesem Teil verfolgen wir den Entwicklungsprozess einer größeren Applikation.

Das Programm QtCommander

Programmieren unter Linux

Das Programm QtCommander

Dies wird ein ähnliches Programm wie Windows Commander sein, das zur Manipulation von Dateien dient. Die Entwicklung der Applikation ist in sechs Versionen unterteilt. Im Artikel werden nur Quellen von wichtigeren Funktionen plaziert; vollständige Quellen für jede Version kann man von der Seite sdjournal.org herunterladen.

In diesem Artikel werden die ersten vier Versionen beschrieben. Wir lernen hier u.a. folgende Elemente kennen:

  • die Klassen QAbstractItemModel und QTreeView, die das Model-View-Konzept implementieren
  • das Ressourcen-System, das ermöglicht, Symbole und beliebige andere Dateien in die Applikation einzufügen
  • den Fokus der Applikation (input focus)
  • die Klassen QMainWindow, QToolBar, QMenuBar und QMenu, die zum Schreiben des Hauptfensters der Applikation dienen

Die nächsten beiden Versionen werden im nächsten Teil beschrieben. Diese Versionen umfassen die Implementation der Drag und Drop-Funktion sowie der Inline-Bearbeitung.

Version 1 und 2

Das Programm QtCommander v2

Programmieren unter Linux

Das Programm QtCommander v2

Die erste Version des Programms zeigt ein leeres Fenster ohne funktionale Elemente an. Dies ist ein Gerüst, mit dem man die meisten Qt-Projekte anfangen kann. Es besteht aus der Klasse MainWindow und der Datei main.cpp, die deren Instanz erzeugt. MainWindow erweitert QMainWindow, die für das Hauptfenster der Applikation zuständige Klasse. In der ersten Version des Programms sieht sie ziemlich bescheiden aus, aber enthält Mechanismen zur Bedienung der Menüleiste, Toolleisten, sowie andockbarer Fenster (dockable windows).

Kommen wir jetzt zur zweiten Version, in der wir zum Hauptfenster eine Ansicht hinzugefügt haben, die einen Verzeichnisbaum anzeigt. Das Programm wird in zwei Komponenten geteilt: das Modell (DirModel), das Verzeichnisse von der Festplatte liest, und in die Ansicht (QTreeView), die sie dem Benutzer anzeigt. In Qt werden Modelle durch QAbstractItemModel erweiterende Klassen implementiert. Diese Klasse ist kein Widget, sie ist also vom Gesichtspunkt des Benutzers unsichtbar. Sie besitzt dafür ein Interface, das von Ansichten implementiert wird. Dasselbe Modell kann dem Benutzer gleichzeitig auf verschiedene Weisen in vielen Ansichten angezeigt werden.

Ansichten werden durch QAbstractItemView erweiterende Klassen implementiert. Qt enthält ein paar fertige Ansichten: QListView zur Anzeige von Listen, QTableView für Tabellen und QTreeView für Bäume. In unserem Fall haben wir es mit einem Verzeichnisbaum zu tun, den wir in Ansichten vom Typ QTreeView anzeigen werden.

QAbstractItemModel

Die Klasse QAbstractItemModel repräsentiert im Allgemeinen eine Tabelle, in der man jedem Feld eine weitere Untertabelle zuordnen kann. Sie ist also zur Modellierung der meisten Datenstrukturen geeignet, die man auf einem zweidimensionalen Monitor anzeigen kann. Im Fall einer Liste enthält die Tabelle eine Spalte, deren Felder keine Kinder haben. In unserem Fall modellieren wir einen Baum; die Wurzeltabelle repräsentiert das Hauptverzeichnis der Festplatte. Jede Zeile dieser Tabelle enthält Informationen über eine Datei oder ein Verzeichnis, wobei die erste Spalte deren Namen, die zweite den Objekttyp (Datei, ausführbare Datei, Verzeichnis), die dritte die Größe usw. enthält.

QAbstractItemModel-Datenstruktur

Programmieren unter Linux

QAbstractItemModel-Datenstruktur

Wenn irgendeine Zeile ein Verzeichnis beschreibt, enthält dessen Untertabelle Zeilen, die Dateien im Verzeichnis entsprechen. Hier gibt es eine gewisse Ungenauigkeit: Untertabellen werden den einzelnen Feldern der Elterntabelle zugeordnet und nicht ganzen Zeilen. Wenn wir aber das Modell schreiben, bestimmen wir die Relationen Eltern-Kinder selbst; das Modell ist so geschrieben, dass ein beliebiges Feld der Zeile auf dieselbe Untertabelle zeigt.

Listing 1. Wichtigere Methoden der Klasse QAbstractItemModel

class QAbstractItemModel : public QObject
{
 Q_OBJECT
public:
 QAbstractItemModel(QObject *parent = 0);
 virtual QModelIndex index(int row, int column,
 const QModelIndex &parent = QModelIndex()) const = 0;
 virtual QModelIndex parent(const QModelIndex &child) const = 0;
 virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0;
 virtual int columnCount(const QModelIndex &parent = QModelIndex()) const = 0;
 virtual QVariant data(const QModelIndex &index,
 int role = Qt::DisplayRole) const = 0;
 virtual QVariant headerData(int section, Qt::Orientation orientation,
 int role = Qt::DisplayRole) const;
protected:
 QModelIndex createIndex(int row, int column, void *ptr = 0) const;
};

Listing 1 zeigt die wichitgsten Methoden in der Klasse QAbstractItemModel. Die meisten davon sind abstrakt (pure virtual). Unsere Aufgabe ist, sie so zu überladen, dass sie Daten zurückgeben, die dem Inhalt der Festplatte entsprechen. Um zu verstehen, wie das Interface QAbstractItemModel der Tabellenhierarchie des Modells entspricht, muss man zuerst die Rolle der Klasse QModelIndex erklären.

Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung