The K Desktop Environment

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