Das K Desktop Environment

10.5. Aufrufen der Dialoge

Wie Sie sich vielleicht schon denken können, bedeutet das Aufrufen der Dialoge nicht nur, daß wir den Dialog zur Auswahl der Stiftgröße implementieren werden, sondern auch, daß wir eine Methode zur Auswahl der Stiftfarbe hinzufügen. Doch eins nach dem anderen. Als erstes erzeugen Sie eine Methode slotPenBrush() in der Klasse KScribbleApp:

   1 void KScribbleApp::slotPenBrush()
   2 {
   3   slotStatusMsg(i18n("Setting brush width..."));
   4 
   5   // get one window with document for a current pen width
   6   QWidgetList windows = pWorkspace->windowList();
   7   KScribbleView* m = (KScribbleView*)windows.at(0);
   8 	KScribbleDoc* pDoc = m->getDocument();
   9   int curr_width=pDoc->penWidth();
  10 
  11   // create the dialog, get the new width and set the pen width for all documents
  12   KPenBrushDlg* dlg= new KPenBrushDlg(this);
  13   dlg->setCurrent(curr_width);
  14   if(dlg->exec()){
  15     int width=dlg->width();
  16   	for ( int i = 0; i < int(windows.count()); ++i )
  17   	{
  18     	m = (KScribbleView*)windows.at(i);
  19     	if ( m )
  20     	{
  21     		pDoc = m->getDocument();
  22         pDoc->setPenWidth(width);
  23     	}
  24   	}
  25   }
  26   slotStatusMsg(i18n("Ready."));
  27 }

Hier müssen wir zuerst auf die Fensterliste zugreifen und den Zeiger auf ein Dokument holen - das ein Dokument eines beliebigen Fensters sein kann, da alle Dokumente die gleiche aktuelle Stiftweite haben sollten. Dann legen wir eine Integervariable curr&_;width an, welche die aktuelle Stiftweite speichert.

Jetzt können wir den Dialog aufrufen, indem wir eine dlg Instanz von KPenBrushDlg erzeugen. Dann setzen wir die aktuelle Stiftweite durch einen Aufruf der Methode dlg->setCurrent(), die wir ja dem Dialog hinzugefügt haben. Durch Aufruf von dlg->exec() zeigen wir den Dialog an. Die if() Anweisung stellt sicher, daß der folgende Code nur ausgeführt wird, wenn das Accept Flag gesetzt ist - das bedeutet, der Code wird ausgeführt, wenn der Benutzer den "OK" Knopf gedrückt hat.

Davon ausgehend, daß der Benutzer den Wert geändert und "OK" gedrückt hat, müssen wir in allen Dokumenten die neue Stiftweite einstellen. Dazu verwenden wir die for() Schleife und setzen in jedem Dokument die entsprechende Variable, die wir zuvor mit dlg->width() geholt haben.

Wir haben die Methode setPenWidth() noch nicht in der Dokumentklasse implementiert, also werden wir das jetzt nachholen:

   1 kscribbledoc.h:
   2 
   3 public:
   4   void setPenWidth( int w ){ pen.setWidth( w ); }

Was noch fehlt, damit überhaupt eine Aktion ausgeführt wird, ist die Methoden hinzuzufügen, die aufgerufen werden sollen, wenn die Menüpunkte aktiviert oder die Knöpfe in der Werkzeugleiste gedrückt werden. Dazu müssen wir die ID's im Slot commandCallback() eintragen, der die entsprechenden Methoden auswählt und ausführt:

   1 void KScribbleApp::commandCallback(int id_)
   2 {
   3   switch (id_)
   4   {
   5     case ID_PEN_BRUSH:
   6       slotPenBrush();
   7       break;
   8 
   9     case ID_PEN_COLOR:
  10       slotPenColor();
  11       break;
  12 ....
  13   }
  14 }

Diese Erweiterung fügt auch die Methode slotPenColor() zum Setzen der Stiftfarbe in die Liste der auszuführenden Methoden ein. Diese Methode werden wir nun implementieren:

   1 void KScribbleApp::slotPenColor()
   2 {
   3   slotStatusMsg(i18n("Selecting pen color..."));
   4 
   5   QColor myColor;
   6   int result = KColorDialog::getColor( myColor, this );
   7   if ( result == KColorDialog::Accepted )
   8   {
   9     QWidgetList windows = pWorkspace->windowList();
  10     KScribbleDoc* pDoc;
  11     KScribbleView* m;
  12     for ( int i = 0; i < int(windows.count()); ++i )
  13     {
  14       m = (KScribbleView*)windows.at(i);
  15       if ( m )
  16       {
  17         pDoc = m->getDocument();
  18         pDoc->setPenColor(myColor);
  19       }
  20     }
  21   }
  22   slotStatusMsg(i18n("Ready."));
  23 }

Wenn wir uns den Code ansehen, erkennen wir, daß wir eine weitere neue Methode von KScribbleDoc verwenden, um die Farbe des Stifts zu setzen. Diese Methode müssen wir ebenfalls implementieren:

   1 kscribbledoc.h:
   2 
   3     /** sets the pen color */
   4     void setPenColor( const QColor &&;c ){ pen.setColor( c ); }

Denken Sie daran, die Deklarationen für slotPenBrush() und slotPenColor() auch einzufügen, damit Ihre Klasse KScribbleApp sie überhaupt kennt.

Nun sind Sie fertig. Lassen Sie uns zusammenfassen, was wir in diesem Kapitel getan haben:

Mit dieser Struktur steht Ihnen ein allgemeiner Weg zur Verfügung, Ihre Anwendung um weitere Funktionalität zu erweitern und Einstellungen zu manipulieren, die das Verhalten des Dokumentes und die Interaktion mit den Ansichten beeinflussen.