PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt Tutorial: Lektion 5



anda_skoa
18-02-2003, 20:42
Ich hab mir diesmal die Umfrage gespart, stimmt ha ohnehin nie jemand was anderes als "passt" :D
Aber wie immer sind "Bugreports" und dergleichen erwünscht!


Lektion 5: Reagieren auf GUI Events

Autor: anda_skoa

In dieser Lektion werden wir sehen, wie man auf GUI Events, wie zB. Mausklicks, reagieren kann.

Als Basis nehmen wir die Dateien aus Lektion 4.

lektion5.pro ist absolut ident mit lektion3.pro, braucht also nur kopiert zu werden.
Für lektion5.cpp gilt das selbe, eventuell muss die Breite des Widgets vergößert werden.

qttutwidget.h und qttutwidget.cpp wurden nun folgendermaßen erweitert:

qttutwidget.h


#ifndef QTTUTWIDGET_H
#define QTTUTWIDGET_H

#include <qlabel.h>

class QtTutWidget : public QLabel
{
public:
QtTutWidget(QString text, QWidget* parent=0, const char* name=0);

protected:
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
};

#endif


qttutwidget.cpp


#include "qttutwidget.h"

QtTutWidget::QtTutWidget(QString text, QWidget* parent, const char* name)
: QLabel(text, parent, name)
{
setPaletteBackgroundColor(Qt::black);
setPaletteForegroundColor(Qt::white);
setMouseTracking(true);
}

void QtTutWidget::mousePressEvent(QMouseEvent* event)
{
QColor color = paletteBackgroundColor();
int red = color.red();
int green = color.green();
int blue = color.blue();

switch (event->button())
{
case Qt::LeftButton:
red = 255;
break;
case Qt::MidButton:
green = 255;
break;
case Qt::RightButton:
blue = 255;
break;
default:
break;
}

color.setRgb(red, green, blue);
setPaletteBackgroundColor(color);
}

void QtTutWidget::mouseReleaseEvent(QMouseEvent* event)
{
QColor color = paletteBackgroundColor();
int red = color.red();
int green = color.green();
int blue = color.blue();

switch (event->button())
{
case Qt::LeftButton:
red = 0;
break;
case Qt::MidButton:
green = 0;
break;
case Qt::RightButton:
blue = 0;
break;
default:
break;
}

color.setRgb(red, green, blue);
setPaletteBackgroundColor(color);
}

void QtTutWidget::mouseMoveEvent(QMouseEvent* event)
{
QString posString;
posString.sprintf(" W:%d,%d / G:%d,%d ",
event->pos().x(), event->pos().y(),
event->globalPos().x(), event->globalPos().y());
setText(posString);
}


Das ist ja einiges an neuem Code, also wieder schön langsam der Reihe nach im Detail.



protected:
void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);


In Qt werden die GUI Events an das jeweilige Widget zugestellt und dort in eine Eventhandler Methode verarbeitet.
Diese Methoden sind in der protected Sektion von QWidget deklariert.

Die Basisimplementation in der Klasse QWidget tut einfach nichts und auch QLabel, von dem wir ja ableiten, reagiert auf keine Mouse Events.
Wir müssen also die Methoden überschreiben, wenn dir etwas mit den Events machen wollen.
Hier überschreiben wir die Methoden für Drücken und Loslassen einer Maustaste und für Mausbewegungen.



setPaletteBackgroundColor(Qt::black);
setPaletteForegroundColor(Qt::white);

Wir setzen die Hintergrundfarbe unseres Widgets auf Schwarz und die Vordergrundfarbe auf Weiß.
Qt definiert im Namensraum Qt einige nützliche Konstanen, unter anderem auch Farbwerte.
Welche Farbwerte das sind, kann man in der Dokumentation von QColor (http://doc.trolltech.com/3.0/qcolor.html) nachlesen.



setMouseTracking(true);

Wir wollen über alle Mausbewegungen in unserem Widget informiert werden, auch wenn keine Taste gedrückt wird.
Darum aktivieren wir hier das Mouse-Tracking.



void QtTutWidget::mousePressEvent(QMouseEvent* event)
{
QColor color = paletteBackgroundColor();
int red = color.red();
int green = color.green();
int blue = color.blue();

Der Kopf einer unserer überschriebener Mouse Event Methode.
Zuerst holen wir uns die aktuelle Hintergrundfarbe.
Dann ermitteln wir die Werte der drei Grundfarben Rot, Grün und Blau (RGB Farbmodell).



switch (event->button())
{
case Qt::LeftButton:
red = 255;
break;
case Qt::MidButton:
green = 255;
break;
case Qt::RightButton:
blue = 255;
break;
default:
break;
}

Nun sehen wir über die Methode button() im QMouseEvent (http://doc.trolltech.com/3.0/qmouseevent.html) nach, welche Taste das Event ausgelöst hat.
Die im Namensraum Qt deklarierte Aufzählung ButtonState enthält vier Werte: LeftButton, MidButton, RightButton und NoButton.
Wir wollen auf Klicks reagieren also interessieren uns hier nur die drei "echten" Buttons.
Je nachdem welche Button zum Auslösen des Events geführt hat, ändern wir eine der drei Grundfarben auf ihr Maximum.



color.setRgb(red, green, blue);
setPaletteBackgroundColor(color);

Wir mischen nun die drei Gundfarben wieder zu einer Gesamtfarbe und setzen diese neue Farbe als unsere neue Hintergrundfarbe.

Die Methode mouseReleaseEvent macht praktisch genau das Gegenteil, wir gehen darum nicht näher daruf ein.



void QtTutWidget::mouseMoveEvent(QMouseEvent* event)
{
QString posString;
posString.sprintf(" W:%d,%d / G:%d,%d ",
event->pos().x(), event->pos().y(),
event->globalPos().x(), event->globalPos().y());
setText(posString);
}

In unserer Methode für Mausbewegungen wollen wir die Position des Mauszeiger in unserem Widget anzeigen lassen.
Bequemerweise kann unser Widget ja bereits einen Text anzeigen, weil es ja von QLabel abgeleitet ist.
Wir müssen also die Mauskoordinaten in einen QString umwandeln.

Dazu verwenden wir die Methode sprintf der Klasse QString.
Diese Methode verhält sich praktisch wie die gleichnamige Funktion aus der C Bibliothek, nur dass sie in einen QString statt in ein char Array schreibt.

Unser Formatstring zeigt an, dass wir vier Ganzzahlen ausgeben möchten.
Diese Zahlen sind die Position des Mauszeigers im Widget (nach W: ) und die Position des Mauszeigers in globalen Koordinaten (nach G: ).
Das QMouseEvent hat praktischerweise beide Positionen durch Methodenaufrufen verfügbar gemacht.
Der Rückgabewert beider Funktionen ist vom Typ QPoint (http://doc.trolltech.com/3.0/qpoint.html).

Der so erzeugte QString wird mit der Methode setText, die unser Widget von QLabel geerbt hat, gesetzt.
Um Weiteres brauchen wir uns dann nicht mehr zu kümmern, dass erledigt unser QLabel Erbe :)

Erzeugung

Wie in Lektion 4 gezeigt wird mit Hilfe der .pro Datei ein Makefile generiert, dass uns dann mit make ein Programm erzeugt.

Ciao,
_

anda_skoa
24-02-2003, 21:12
Ins Tutorial übernommen.

Wäre schön, wenn mal jemand eine weitere Lektion machen würde :)

Lektion 6 werde ich Ende der Woche ins Tutorial kopieren.

Ciao,
_