© StonePictures/Shutterstock.com
Teil 6: Fortgeschrittene Module des Frameworks verwenden

Qt verwaltet Daten


Qt-Applikationen beschränken sich nicht auf das Anzeigen von Daten. Das Framework bietet Entwicklern eine Vielzahl von Hilfsklassen an, die ihre Arbeit im Backend erledigen und sich um Parsing, Netzwerkkommunikation oder Datenpräsentation kümmern.

Aus der Logik folgt, dass eine Komplettbesprechung des Themas an dieser Stelle nicht möglich ist – der Autor verfasste vor einigen Jahren ein rund 300 Seiten umfassendes Lehrbuch, das auch nur an der Oberfläche kratzen konnte. Wir wollen unsere Ausführungen hier am Datenmodell-API ausrichten. Dahinter steckt der Gedanke, dass Qt Entwickler nicht dazu zwingt, alle am Bildschirm sichtbaren Elemente in den Steuerelementen unterzubringen. Stattdessen ist es auch erlaubt, analog zum Modell-View-Controller-Pattern, Informationen im Hintergrund zu halten und die Visualisierung ans Framework abzutreten.

Eine Frage des Steuerelements

MVC-Applikationen lassen sich in Qt sowohl mittels QtGUI als auch mittels QML entwerfen. Wir wollen in den folgenden Schritten – schon aus Gründen der Bequemlichkeit – auf den klassischen QtGUI-Stack setzen. Deshalb erzeugen wir eine neue Applikation auf Basis der Vorlage Application | Qt Widgets Application. Öffnen Sie danach die .ui-Datei, um den WYSIWYG-Editor zu aktivieren. Die für die Darstellung von Informationen zuständigen Steuerelemente präsentieren sich dann wie in Abbildung 1.

hanna_qt_teil6_1.tif_fmt1.jpgAbb. 1: Datengetriebene Steuerelemente stehen in zwei Variationen zur Verfügung

Die mit dem Suffix Item-Based ausgestatteten Widgets bringen dabei die Logik, die für das Vorhalten der Informationen notwendig ist, mit. Elemente der Art Model-Based erwarten stattdessen die Bereitstellung eines „externen“ Datenmodells, das der Entwickler natürlich auch an anderer Stelle in seiner Applikation weiterverwenden darf.

Zur Demonstration der Mächtigkeit dieses Features wollen wir uns anfangs eine TreeView greifen, die sie wie gewohnt im Formular platzieren und maximieren. Wechseln Sie danach in den Code-behind und platzieren Sie im Konstruktor den Code aus Listing 1.

Listing 1

# include <QFileSystemModel> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QFileSystemModel* myModel=new QFileSystemModel(this); myModel->setRootPath("/"); ui->treeView->setModel(myModel); }

Qt bietet mit der QFileSystemModel-Klasse ein Modell an, das seine Informationen aus dem Dateisystem der Hostworkstation bezieht. Wer – wie der Autor – die folgenden Experimente aus Spaß an der Freude unter Unix vollzieht, legt durch den Aufruf von setRootPath mit dem Parameter "/" fest, dass das Modell alle Inhalte im Stammverzeichnis des Dateisystems anzeigen soll. Wer das Programm dann zur Ausführung bringt, stellt fest, dass er – mehr oder weniger nach Belieben – durch sein Dateisystem navigieren kann.

Neben dem bequemen Bereitstellen von Dateisysteminformationen sei angemerkt, dass sich QFileSystemModel auch um die Parallelisierung der Aufgaben kümmert. Die eigentliche Beschaffung der Daten erfolgt beiläufig, was zur schnellen Reaktionsgeschwindigkeit unseres Programms beiträgt.

Die wahre Stärke von modellbasierten Steuerelementen offenbart sich, wenn wir das Verhalten unseres Programms anpassen. Als kleine Fingerübung wollen wir unsere Liste dazu animieren, nur JPEG-Dateien anzuzeigen. Was bei Verwendung einer von Hand entwickelten Klasse in extreme Arbeit ausarten würde, lässt sich dank der QFileSystemModel-Instanz mit dem vergleichsweise kurzen Snippet in Listing 2 bewerkstelligen.

Listing 2

QStringList *myStringList=new QStringList(); myStringList->append("*.jpg"); myStringList->append("*.jpeg"); myModel->setNameFilters(*myStringList); myModel->setNameFilterDisables(false);

An dieser Stelle ist vor allem die Methode setNameFilterDisables relevant: Sie informiert das Framework darüber, dass vom Filter ausgeschlossene Dateien überhaupt nicht im Zielobjekt erscheinen dürfen. Wenn Sie hier stattdessen True übergeben würden, würde Qt Nicht-JPEG-Dateien mit der Verwendung eines grauen Fonts darstellen.

Entgegennehmen von Klickereignissen

Wenn alle zu bearbeitenden Daten als Member der Widget-Steuerelementklassen vorliegen, hat man bei der Event-Verarbeitung ein leichtes Leben. Unsere soeben eingeführten Modelle erschweren die Situation insofern, als das Widget nun nicht mehr über eine Eins-zu-eins-Beziehung zwischen Datenfeld und angeklicktem, Element verfügt.

Um dieses Problem zu umgehen, führt Qt den ModelIndex ein – zu seiner Vorführung wollen wir unsere Review im ersten Schritt um ein Klickereignis erweitern. Kehren Sie in den WYSIWYG-Editor zurück und öffnen Sie die aus den vorhergehenden Teilen der Artikelserie bekannte Signal-Slot-Ansicht. Verbinden Sie danach das Signal doubleClicked(QModelIndex) mit dem neu anzulegenden Slot itemDoubleClicked(QModelIndex). Schon hier fällt auf, dass die Übertragung von Informationen über das aktivierte Element durch eine Instanz der Klasse QModelIndex erfolgt.

Achten Sie darauf, dass Sie beim Verwenden von QModelIndex als Signal- bzw. Slotparameter im Header der Datei unbedingt eine vollwertige Inklusion über den #include-Befehl durchführen müssen. Wenn Sie die Klasse nur über das Class-Schlü...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang