Das K Desktop Environment

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:

   1   void KScribbleApp::slotFileOpen()
   2   {
   3     slotStatusMsg(i18n("Opening file..."));
   4   	
   5 ->    QString fileToOpen=KFileDialog::getOpenFileName(QDir::currentDirPath(),
   6 ->              KImageIO::pattern(KImageIO::Reading), this, i18n("Open File..."));
   7     if(!fileToOpen.isEmpty())
   8     {
   9   		openDocumentFile(fileToOpen);		
  10     }
  11 
  12     slotStatusMsg(i18n("Ready."));
  13   }

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:

   1 void KScribbleApp::slotFileSaveAs()
   2 {
   3   slotStatusMsg(i18n("Saving file with a new filename..."));
   4 
   5 ->  QString newName=KFileDialog::getSaveFileName(QDir::currentDirPath(),
   6 ->                               KImageIO::pattern(KImageIO::Writing), this, i18n("Save as..."));
   7   if(!newName.isEmpty())
   8   {
   9     KScribbleView* m = (KScribbleView*)pWorkspace->activeWindow();
  10     if( m )
  11     {
  12       KScribbleDoc* doc =	m->getDocument();
  13   	  QString format=QFileInfo(newName).extension();
  14   	  format=format.upper();
  15 		  if(!doc->saveDocument(newName,format))
  16   	  {
  17   		  KMessageBox::error (this,i18n("Could not save the current document !"), i18n("I/O Error !"));
  18 				return;
  19 			}
  20       doc->changedViewList();
  21       setWndTitle(m);
  22     }
  23   }
  24   slotStatusMsg(i18n("Ready."));
  25 }