# 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:

- Zunächst haben wir Menü- und Werkzeugleistenkommandos und -elemente für zwei Dialoge, die wir aufrufen wollen, eingefügt.

- Dann haben wir mit dem Dialogeditor den Dialog zum Einstellen der Stiftweite erstellt.

- Als nächstes haben wir die Methoden geschrieben, die die Dialoge aufrufen und die Eigenschaften setzen die wir ändern wollen.

- Schließlich haben wir die benötigten Set-Methoden hinzugefügt, sodaß wir in der Lage sind, die Werte zu ändern, nachdem die Dialoge ausgeführt worden sind.

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.