Aus LinuxUser 12/2001

Adventskalender mit C++ und Qt (Seite 4)

QPixmap tuerfuellung( bild_tuer );

machen wir aus der Beschreibung erst einmal ein richtiges Pixmap-Objekt (keinen Zeiger!) namens tuerfuellung, das wir mit

QPainter leinwand( &tuerfuellung );

auf eine virtuelle Leinwand kleben. Jetzt holen wir einen weißen Stift für diese leinwand

leinwand.setPen( Qt::white );

und schreiben in der linken, oberen Ecke (Qt::AlignTop) eines auf dem QPainter links oben (bei den Koordinaten 0,0) beginnenden Rechtecks von 64 Pixeln Breite und eben dieser Höhe den Text, der in der Variablen aufschrift gespeichert ist:

leinwand.drawText( 0, 0, 64, 64, Qt::AlignTop, QString::number( aufschrift ) );

aufschrift ist aber eine ganzzahlige Zahl und kein Text. Den machen wir aus ihr mit Hilfe der QString-Funktion number(). Wir räumen die Staffelei weg (leinwand.end();) und erzeugen den Button mit der veränderten Pixmap, auf den unser Zeiger tuer weisen soll:

tuer = new QPushButton( this );
  tuer->setPixmap( tuerfuellung );

Auch das Türfüllungsbild misst nicht ganz 64×64 Pixel, weshalb es sich anbietet, die Farbpalette des hinter tuer versteckten Objekts entsprechend anzupassen. Mit Tools wie xv oder display erfährt man den RGB-Wert der entsprechenden Hintergrundfarbe, bei tuer.xpm auf der CD ist es ein Rotanteil von 0, ein Grünanteil von 155 und ein Blauanteil von 0. Da setPalette() auch QColor-Objekte als Argument entgegennimmt, machen wir aus dem RGB-Wert zunächst ein solches:

tuer->setPalette( QColor( 0, 155, 0 ) );

Damit das komplette Tuerchen-Objekt nicht über die Größe der darin enthaltenen Bildchen hinauswächst, legen wir noch eine feste Größe fest:

setFixedSize( 64, 64 );

Hört die Signale!

Das wäre dann auch schon fast die gesamte Arbeit des Konstruktors gewesen – wenn sich so ein Türchen nicht auch einmal öffnen sollte. Die Aufforderung dazu kommt von Benutzer/innen, die auf den sichtbaren Pushbutton des Tuerchen-Objekts klicken. Dieser sendet daraufhin ein Signal namens clicked() in die Welt. Doch wenn niemand darauf reagiert, passiert auch nichts. Daher müssen wir das clicked()-Signal von tuer mit einem Slot verbinden, einer Funktion, die dafür sorgt, dass etwas geschieht. Dazu dient die Qt-spezifischen Zeile

connect( tuer, SIGNAL( clicked() ), this, SLOT( open() ) );

… , sofern in der Klassendeklaration von Tuerchen im Include-File tuerchen.h das Stichwort (Makro) Q_OBJECT (ohne Semikolon) steht. Allerdings hat Tuerchen bislang noch gar keinen Slot namens open(). Ihn müssen wir in der API mit

private slots:
   void open();

deklarieren und in tuerchen.cpp dazu bringen, dass er auch etwas tut:

void Tuerchen::open() {

Argumente braucht open() keine und muss auch nichts zurückgeben (daher der Rückgabewert void). Was aber passiert, wenn ein Türchen angeklickt wird? Es soll geöffnet werden, aber nur, wenn der entsprechende Tag gekommen ist. Daher holen wir uns mit der QDate-Funktion currentDate() das aktuelle Datum:

QDate heute = QDate::currentDate();

Wer bereits im November zu neugierig ist, soll eine Fehlermeldung bekommen, allerdings eine andere als im Dezember (von Januar bis Oktober machen wir der Einfachheit halber kein Geheimnis aus dem Kalenderinhalt). Die Nachricht selbst legen wir in einer Hilfsvariablen vom Typ QString ab; den Monat bekommen wir aus einem QDate-Objekt mit der Funktion month() heraus:

QString nachricht;
   if ( heute.month() == 11 ){
     nachricht = "Jetzt ist aber noch November!\n"
                        "Schummeln gilt nicht!";

Das \n in der Zeichenkette nachricht steht dabei für einen Zeilenumbruch („newline“). Im Dezember machen wir die nachricht etwas komplizierter und geben den aktuellen Tag (QDate::day()) mit an.

} else if ( heute.month() == 12 ){
     nachricht = "Heute ist erst der " +
                 QString::number( heute.day() ) +
                 ". Dezember!\n Schummeln gilt nicht!";
   }

Allerdings gibt diese Funktion einen ganzzahligen Wert zurück, den wir in einen QString umwandeln. Dabei kommt uns zugute, dass sich QStrings einfach durch Pluszeichen miteinander „addieren“, also aneinander anhängen lassen.

Wer schummelt und im Dezember ein Türchen anklickt, dessen aufschrift größer als der entsprechende Tag ist, oder () im November versucht „einzubrechen“, …

if ( ( heute.month() == 12 && heute.day() < aufschrift )
           || heute.month() == 11 ){

… soll auf seine Missetat aufmerksam gemacht werden (&& besagt als logisches Und, dass sowohl die davor als auch die danach stehende Bedingung stimmen muss, damit die Teilbedingung in runden Klammern wahr wird), und zwar mit einer Messagebox.

LinuxUser 12/2001 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: