1. Einfaches Beispiel eines Qt-Programms

Ein eigenes Qt-Programm zu schreiben ist dank des Qt-Designers heutzutage kein Hexenwerk mehr, da man sich seine Fenster und Schaltflächen ganz einfach mit der Maus zusammenklicken kann und sich sonst nur noch um die Funktionalität des Programms kümmern muß. Und gerade für diese Funktionalität stellt die Qt-Bibliothek eine Unmenge an Befehlen zur Verfügung. Wer also sein eigenes Qt-Programm schreiben will, sollte erstmal einen Blick auf die Qt Reference Documentation werfen und sich die für sein Programm benötigten Befehle zusammensuchen. In diesem Beitrag geht es nun darum, ein simples und einfaches Qt-Programm zu erstellen um die grundlegende Arbeitsweise beim Erstellen von Qt-Programmen aufzuzeigen. Unser kleines Programm macht nichts anderes als mitzuteilen, ob ein Radio-Knopf ausgewählt wurde oder nicht.

Zuerst müssen wir dafür einen Ordner erstellen. Der Name des Ordners wird später zu unserem Programmnamen. Nennen wir ihn einfachesBeispiel. Als nächstes starten wir den Qt4-Designer über den entsprechenden Eintrag im Startmenü. Im zentralen Fenster Neues Formular können wir eine Formularvorlage für unser Programm auswählen. Wir wählen Dialog with Buttons Bottom und klicken auf Neu von Vorlage. Es erscheint ein Fenster mit den zwei Standard-Button OK und Abbrechen, welches in der Größe beliebig skalierbar ist. Im Fenster Signale und Slots darüber kann man sehen, daß die Standard-Buttons schon mit den eingebauten Funktionalitäten accept() und reject() verknüpft sind, daher müssen wir uns um selbige keine Gedanken machen. Im linken Fenster kann man die jeweiligen Widgets für die Oberfläche auswählen und wir suchen unter Buttons das Objekt Radio Button und ziehen es mit der Maus in unser neues Dialog-Fenster. Anschließend ziehen wir unter Input Widgets das Line Edit Objekt ebenfalls in unser Fenster. Wie man sieht, kann man sich seine benötigten Widgets einfach mittels Drag&Drop zusammenstellen. Auch ist es möglich die Objekte durch halten mit der Maus zu verschieben oder an den Rändern die Größe zu ändern. Unser Dialog-Fenster speichern wir in unserem erstelltem Ordner unter dem Namen einfachesBeispiel.ui und sieht nun in etwa so aus:

Bild: einfachesBeispiel-ui.jpg

Abschließend müssen wir unserem Dialog und den darin enthaltenen Widgets einen Namen vergeben. Bei komplexen Projekten empfehlen sich aussagekräftige Namen, da über diese die jeweiligen Objekte angesprochen werden. Um die Eigenschaften eines Widgets einzustellen oder zu verändern, selektiert man das entsprechende Widget und kann dann im Eigenschaften-Fenster die gewünschten Einstellungen vornehmen. Für unser Projekt wählen wir unser Dialog-Fenster und geben ihm unter objectName den Namen zeigeRadioKnopf. Da unser Projekt lediglich zwei Widgets hat, belassen wir die Bezeichnungen für den RadioButton und das LineEdit auf den Standardnamen radioButton und lineEdit. Nach einem Klick auf speichern sind die Arbeiten im Qt4-Designer abgeschlossen. Alle weiteren Dateien muß man von Hand in einem Texteditor wie kwrite erstellen.

Für unser Projekt benötigen wir 4 Dateien:

  • einfachesBeispiel.ui - die grafische Oberfläche vom Qt-Designer erstellt (siehe oben).
  • main.cpp - das Hauptprogramm.
  • einfachesBeispiel.h - enhält die Deklarierung eigener Klassen und Slots.
  • einfachesBeispiel.cpp - enthält die Verbindungen und Funktionen der Signale und Slots.
Die Dateien müssen folgende Einträge beinhalten:

main.cpp

#include <QApplication>

#include "einfachesBeispiel.h"


int main(int argc, char *argv[])
{
QApplication app(argc, argv);
zeigeRadioKnopf *dialog = new zeigeRadioKnopf; // Name des Dialogfeldes
dialog->show();
return app.exec();
}

Wie man sieht, ist im Kopf unsere Header-Datei einfachesBeispiel.h includiert. Mittels des Namens, den wir unserem Dialog-Feld im Qt-Designer gegeben haben, wird ein neues Dialog-Fenster erzeugt und mit der Funktion show() angezeigt.

einfachesBeispiel.h

# ifndef EINFACHESBEISPIEL_H
# define EINFACHESBEISPIEL_H

#include <QDialog>

#include "ui_einfachesBeispiel.h"


class zeigeRadioKnopf : public QDialog, public Ui::zeigeRadioKnopf
{
Q_OBJECT

public:
zeigeRadioKnopf(QWidget *parent = 0);

private slots:
void punktgesetzt();

};

# endif

Hier darf man sich nicht wundern, daß die Datei ui_einfachesBeispiel.h includiert wird, welche gar nicht existiert da wir sie nicht angelegt haben. Das macht der Compiler qmake für uns. Er erzeugt aus unserer *.ui-Datei vom Qt-Designer die entsprechende Header-Datei die die Definitionen für den Radio Knopf und das Line Edit enthält und nennt diese wie die ui-Datei nur mit ui_ am Anfang und natürlich der Endung .h für Header-Datei. Anschließend wird von der Hauptklasse QDialog unsere Subklasse zeigeRadioKnopf abgeleitet. Unter private slots: ist die Definition für unseren eigenen Slot, welchem wir nun in der Datei einfachesBeispiel.cpp Funktionalität einhauchen.

einfachesBeispiel.cpp

#include <QtGui>

#include "einfachesBeispiel.h"


zeigeRadioKnopf::zeigeRadioKnopf(QWidget *parent): QDialog(parent)
{
setupUi(this);

lineEdit->setText("Beispieltext");

connect(radioButton, SIGNAL(clicked()), this, SLOT(punktgesetzt()));

}

void zeigeRadioKnopf::punktgesetzt()
{
if(radioButton->isChecked())
lineEdit->setText("checked");
else
lineEdit->setText("unchecked");
}

Die erste Funktion ist für unser Dialog-Fenster selbst und wird beim erzeugen des Dialogs aufgerufen. Der Befehl
lineEdit->setText("Beispieltext");
sorgt dafür, daß in unserem lineEdit-Feld gleich mal ein bischen Text plaziert wird. Mittels dem Befehl
connect(radioButton, SIGNAL(clicked()), this, SLOT(punktgesetzt()));
wird das clicked-Signal des Radio Buttons mit unserem eigenem Slot punktgesetzt() verbunden. In Qt funktioniert die Kommunikation zwischen den einzelnen Elementen immer nach dem Signale/Slots-Prinzip, d.h. Widgets können ein Signal senden, welches man mit einem Slot verknüpft, welcher vom Prinzip her eine normale Funktion darstellt. Es ist auch möglich ein Signal mit mehreren Slots zu verbinden, so daß ein Ereignis mehrere Funktionen auslösen kann. Ebenso geht das auch umgekehrt, also daß mehrere unterschiedliche Signale ein und diesselbe Funktion aufrufen. Und als nächstes in unserem Beispiel kommt gleich unser selbstdefinierter Slot punktgesetzt(), der die Befehle enthält, wenn besagtes Signal clicked() vom RadioButton ausgelöst wird. In unserem Fall wird eine Abfrage initiiert, ob der Radio Button einen Punkt enthält oder nicht. Das Ergebnis wird mit den Worten checked und unchecked in dem Line Edit-Feld mitgeteilt. Damit ist unser einfaches Beispiel fertig und kann mit dem Aufruf
# qmake -project; qmake; make
kompiliert werden. Das Ergebnis ist eine ausführbare Datei mit dem Namen des Ordners ohne Endung. Wer selbst mit dem Programm rumspielen möchte, kann sich hier ein .tar.gz-Archiv runterladen, welches alle nötigen Dateien enthält: einfachesBeispiel.tar.gz

Noch ein Hinweis zum Schluß: Um Fehler im Programm aufzuspüren, kann man entweder im Dialog-Fenster ein QTextEdit (am Besten mit RichText) einfügen und einzelne Variablen mittels
QTextEdit->append(Variable);
posten oder man führt das Programm auf der Konsole aus und kann mittels des Befehls
qDebug() << Variable;
die Variablen auf stdout ausgeben lassen.