KDE Anwendungs Tutorials: Der KDE Anwendungs-Tutorial Leitfaden für die Integrierte Entwicklungsumgebung KDevelop | ||
---|---|---|
Zurück | Kapitel 9. Definition der Ansicht | Vor |
Übrig bleiben zwei virtuelle Handler, die reimplementiert werden müssen. Als erstes müssen wir darauf achten, daß unser Bild im Fenster neu gezeichnet wird, wenn etwas anderes passiert: wenn Sie ein anderes Fenster öffnen, das die Zeichnung verdeckt, wird sie nicht mehr da sein, wenn sie wieder zu Ihrer Zeichnung wechseln, es sei denn, Ihr Zeichenereignis wird ausgeführt, so daß das Bild neu gezeichnet wird:
1 void KScribbleView::paintEvent( QPaintEvent *e ) 2 { 3 QWidget::paintEvent( e ); 4 5 QRect r = e->rect(); 6 7 bitBlt( this, r.x(), r.y(), &&;doc->buffer, r.x(), r.y(), r.width(), r.height() ); 8 } |
Diese Methode verwendet ebenfalls bitBlt() zum Zeichnen des Puffers in das Widget. Hier brauchen wir nur den Ausschnitt der, neugezeichnet wird, also holen wir uns die Geometrie des Events ( e->rect() ) und verwenden die Koordinaten für bitBlt() genau wie wir es bei mouseMoveEvent() gemacht haben.
Das einzige, um das wir uns nicht gekümmert haben, ist die Größe des Pixmaps. Wir haben sie nirgendwo gesetzt - wir haben noch nicht einmal das Pixmap aus der Dokumentklasse benutzt, außer zum Laden und Speichern- aber diese Methoden werden nicht aufgerufen, wenn ein neues Bild erzeugt wird. Es scheint also, unser Pixmap habe weder eine Größe noch einen vordefinierten Hintergrund (selbst wenn wir die Größe gesetzt hätten, wären die Inhalte zufällige Farben, weil es nicht initialisiert wurde). Andererseits haben wir die Tatsache, daß die KScribbleView Instanzen in der Größe angepasst werden wenn sie angezeigt werden- wenigstens auf die Minimalgröße. Das ist der Punkt, an dem wir auch die Initialisierung vornehmen können, weil der Benutzer die Größe manuell ändern kann und das Widget ebenfalls ein resize Event erhält. Aus Gründen der Einfachheit, setzen wir die Pixmap Größe gleich der Widgetgröße. All dies geschieht im Event Handler resizeEvent():
1 void KScribbleView::resizeEvent( QResizeEvent *e ) 2 { 3 QWidget::resizeEvent( e ); 4 5 int w = width() > doc->buffer.width() ? 6 width() : doc->buffer.width(); 7 int h = height() > doc->buffer.height() ? 8 height() : doc->buffer.height(); 9 10 QPixmap tmp( doc->buffer ); 11 doc->buffer.resize( w, h ); 12 doc->buffer.fill( Qt::white ); 13 bitBlt( &&;doc->buffer, 0, 0, &&;tmp, 0, 0, tmp.width(), tmp.height() ); 14 } |
Hier wird zunächst der resizeEvent Handler von QWidget aufgerufen. Dann berechnen wir die Größe unseres Bildes- da wir ein Fenster sowohl kleiner als auch größer machen können, müssen wir diese beiden Fälle unterscheiden: wenn wir verkleinern, soll das Bild immer noch seinen gesamten Inhalt behalten. Wenn wir jedoch das Widget vergrößern, müssen wir das Pixmap auch auf diese neue Größe bringen. Die errechneten Werte werden in w und h gespeichert. Bevor jedoch die Größe verändert wird, erzeugen wir eine Kopie des Pixmaps in tmp. Dann verändern wir den Puffer (das Dokument), füllen es mit weißer Farbe und kopieren dann den Inhalt von tmp in den Puffer zurück. Die ändert unser Pixmap immer synchron mit dem Widget, von dem es angezeigt wird, aber es verliert nicht die Daten, die außerhalb des sichtbaren Bereiches liegen, wenn das Widget verkleinert wird.
Wir sind an einem Punkt angekommen, an dem wir die Funktionalität unserer Anwendung testen können. Drücken Sie "Ausführen", und nachdem KScribble angezeigt wird, sind Sie bereit, Ihr erstes Bild damit zu zeichnen !