Weiter Zurück Inhaltsverzeichnis
Wenn es um Bilder geht, bieten die Qt und KDE Bibliotheken ein weites Feld an Operationen.
Neben den reinen Zeichenroutinen unterstützen die Bibliotheken einen ganzen Satz an
Bildformaten, die gelesen und geschrieben werden können- alles ohne Einschränkungen für Ihre
Ansicht. Die Hauptklasse für diese Operationen ist QImageIO
, die auch eine
Supportbibliothek unter KDE hat: KImageIO
. Zur Vorbereitung und bevor wir diese
schönen Routinen verwenden können, müssen wir die erforderliche Bibliothek für KScribble
verfügbar machen: nämlich libkimgio. Öffnen Sie "Projekt"->"Optionen" in KDevelop und fügen Sie
die Zeile -libkimgio bei den zusätzlichen Bibliotheken ein.
Nun können wir unsere Änderungen vornehmen. Als erstes müssen wir die Einschränkung, nur PNG
Dateien lesen und schreiben zu können, entfernen. Ersetzen Sie in den folgenden Methoden, "PNG"
durch "format", wie in den Methoden openDocument()
und saveDocument()
:
In der Methode KScribbleDoc::openDocument()
:
if(!buffer.load( filename, format ))
In der Methode KScribbleDoc:: saveDocument()
:
if(!buffer.save( filename, format ))
Jetzt haben wir ein Standardverhalten in diesen Methoden. Trotzdem stehen uns noch nicht alle möglichen Dateiformate zur Verfügung. Darum, und um die Adaptierung der Slots, die uns Dateinamen liefern, kümmern wir uns als nächstes.
Um KImageIO
zu benutzen, müssen wir erst die Bibliothek initialisieren. Dazu fügen wir
einen Aufruf von registerFormats()
in unsere main()
Funktion ein:
main.cpp: ............ KApplication app; KImageIO::registerFormats(); if (app.isRestored()) ............
Beachten Sie, daß dieser Aufruf nach der Instanzierung mit KApplication app erfolgt- ohne die
Applikationsinstanz läuft unser Programm nicht, weil KImageIO
dann nicht weiß, bei
welcher Anwendung die Formate registriert werden sollen. Die Includedatei werden wir in
kscribble.h eintragen, da wir einige der Methoden darin, in KScribbleApp
verwenden
werden:
kscribble.h:
#include <kimgio.h>
Jetzt, da wir KImageIO
verwenden können, werden wir die erste Änderung in der
wichtigsten Methode von KScribbleApp
vornehmen: openDocumentFile()
. Diese
Methode öffnet uns bis jetzt jedes Dokument nur Anhand des Dateinamens. Sie läßt einfach die
Erweiterung weg, da das Format normalerweise nicht von der Dokumentklasse benötigt wird. Aber
da wir dies geändert haben, brauchen wir jetzt das Format und müssen den Aufruf für
KScribbleDoc::openDocument()
in der Methode openDocumentFile()
adaptieren:
kscribble.cpp: void KScribbleApp::openDocumentFile(const char* file) { ........... else { -> QString format=KImageIO::type(file); -> if(!doc->openDocument(file,format)) KMessageBox::error (this,i18n("Could not open document !"), i18n("Error !")); addRecentFile(file); } ............ }
Es funktioniert natürlich genauso wie die Verwendung von QString format=QImageIO::imageFormat(file);
. Hier liefert uns KImageIO
das Format des Bildes
und wir können dem Dokument mitteilen, die Datei mit dem Dateinamen und dem Format zu öffnen (
eine weitere Möglichkeit wäre, das Format in der Dokumentklasse zu ermitteln).
Mit diesem Kapitel endet unsere Einführung. Wir werden die Dateidialoge von KScribble dazu
bringen, Dateifilter zu verwenden. Zu diesem Zweck bietet KImageIO
Methoden, uns die Bezeichnungen aller
Bilddateiformate zu holen, die man öffnen und speichern kann. Die folgende Implementierung ersetzt
den Standardfilter (der eigentlich gar keiner ist - Sie müssen den Dateifilter Ihrer Anwendung den
nötigen Mimetypen anpassen), indem sie die pattern()
Methode von KimageIO
verwendet:
void KScribbleApp::slotFileOpen() { slotStatusMsg(i18n("Opening file...")); -> QString fileToOpen=KFileDialog::getOpenFileName(QDir::currentDirPath(), -> KImageIO::pattern(KImageIO::Reading), this, i18n("Open File...")); if(!fileToOpen.isEmpty()) { openDocumentFile(fileToOpen); } slotStatusMsg(i18n("Ready.")); }
Wir setzen hier den Modus in pattern()
auf Lesen - was sich von dem zum Schreiben benutzten
Patterns unterscheided. Jetzt haben wir das Öffnen der Datei mit Dateinamen und Format
erledigt. Was noch zur Vervollständigung der Struktur fehlt, ist das Setzen der Patterns auch zum
Schreiben. Dazu wird der Slot slotFileSaveAs()
aufgerufen, der dann seinerseits den
Dateidialog aufruft, in dem dann der Dateiname abgefragt wird. Dort werden wir den Patternmodus zum
Schreiben setzen:
void KScribbleApp::slotFileSaveAs() { slotStatusMsg(i18n("Saving file with a new filename...")); -> QString newName=KFileDialog::getSaveFileName(QDir::currentDirPath(), -> KImageIO::pattern(KImageIO::Writing), this, i18n("Save as...")); if(!newName.isEmpty()) { KScribbleView* m = (KScribbleView*)pWorkspace->activeWindow(); if( m ) { KScribbleDoc* doc = m->getDocument(); QString format=QFileInfo(newName).extension(); format=format.upper(); if(!doc->saveDocument(newName,format)) { KMessageBox::error (this,i18n("Could not save the current document !"), i18n("I/O Error !")); return; } doc->changedViewList(); setWndTitle(m); } } slotStatusMsg(i18n("Ready.")); }
Weiter Zurück Inhaltsverzeichnis