Weiter Zurück Inhaltsverzeichnis

### 12. Verwendung von KImageIO mit KScribble

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.

### 12.1 Vorbereiten des Dokuments

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.

### 12.2 Registrierung von Dateiformaten

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>

### 12.3 Bilddateien öffnen

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).

### 12.4 Setzen von Dateifiltern mit KImageIO

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