Qt-Widgets
Willemers Informatik-Ecke
Weitere Themen

Ein nacktes Fenster - QWidget

Das folgende Programm erzeugt ein Fenster. Dieses ist allerdings kein Hauptfenster. Zur Erzeugung muss zunächst eine Instanz von QApplication angelegt werden, die dann später über die Methode exec gestartet wird.
#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    // Initialisiere eine QApplication-Instanz
    QApplication app(argc, argv);
    QWidget fenster; // lege ein Fenster an ..
    fenster.show();  // ... und zeige es.
    // Starten der QApplication
    return app.exec();
}
Für die Verwendung von Widgets muss die folgende Zeile in der Projektdatei eingetragen werden, ansonsten entsteht beim späteren Compilieren der Fehler, dass QApplication nicht gefunden wurde.
QT += widgets

QWidget-Methoden

Layouts

Sollen mehrere Kontrollelemente in ein Fenster gesetzt werden, muss definiert werden, in welchem Verhältnis sie zueinander stehen sollen. Dazu dienen Layouts mit ihrer Basisklasse QLayout.

QLayout stellt die Methode addWidget(widget) zur Verfügung, um das Kontrollelement einzubinden.

Durch Verschachteln von Layouts können mehrere unterschiedliche Layouts miteinander kombiniert werden.

Das Layout wird dem Fenster durch den Aufruf von setLayout zugewiesen.

window->setLayout(layout);

QBoxLayout

Mit dem Box-Layout werden Widgets neben- oder übereinander angeordnet. Entsprechend gibt es zwei Klassen:

Gitter: QGridLayout

QGridLayout ordnet die Widgets auf einem Gitter an.
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLayout>

int main(int argc, char *argv[])
{
    // Initialisiere eine QApplication-Instanz
    QApplication app(argc, argv);
    QWidget fenster; // lege ein Fenster an ..
    QLabel frage("Frage", &fenster);
    QLabel antwort("Antwort", &fenster);
    QPushButton unbekannt("Unbekannt", &fenster);
    QPushButton gewusst("Gewusst", &fenster);
    QGridLayout grid(&fenster);
    grid.addWidget(&frage, 0 , 0);
    grid.addWidget(&antwort, 0 , 1);
    grid.addWidget(&unbekannt, 1 , 0);
    grid.addWidget(&gewusst, 1 , 1);
    fenster.show();  // ... und zeige es.
    // Starten der QApplication
    return app.exec();
}

Signale und Slots

Die Kontrollelemente verursachen Ereignisse, die von der Anwendung ausgewertet werden müssen. Unter Qt bezeichnet man ein solches auslösendes Ereignis als Signal. Die Methode, die sich um ein Ereignis kümmert, wird als Slot angesehen. Die Verbindung zwischen beiden wird durch die Methode connect erreicht.

Das folgende Listing zeigt Rahmen.h, die Headerdatei für einen Fensterrahmen, der QWidget beerbt:

#ifndef RAHMEN_H
#define RAHMEN_H

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QLayout>

class Rahmen : public QWidget
{
    Q_OBJECT

public:
    Rahmen();

public slots:
    void clkUnbekannt();
    void clkSehen();
    void clkGewusst();

private:
    QPushButton *btUnbekannt;
    QPushButton *btGewusst;
    QPushButton *btSehen;
};

#endif // RAHMEN_H
Im folgenden Listing wird der Konstruktor von Rahmen dargestellt. Darin wird die Methode connect aufgerufen. Die Parameter sind:

#include "Rahmen.h"

Rahmen::Rahmen()
{
    btUnbekannt = new QPushButton("Unbekannt", this);
    btGewusst = new QPushButton("Gewusst", this);
    btSehen = new QPushButton("Sehen", this);

    QObject::connect(btUnbekannt, SIGNAL(clicked()), this, SLOT(clkUnbekannt()));
    QObject::connect(btGewusst, SIGNAL(clicked()), this, SLOT(clkGewusst()));
    QObject::connect(btSehen, SIGNAL(clicked()), this, SLOT(clkSehen()));
}

Kontrollelemente, Widgets

Label QLabel

Das Label zeigt einen Text an und ist ansonsten nicht aktiv. Dem Konstruktor wird der anzuzeigende Text und das Elternwidget übergeben.
QLabel(const QString &text, QWidget *parent);
Methoden Auch das inaktive Label kann Slots anbieten.
virtual void setText(const QString&);
virtual void setMovie(const QMovie&);
void clear(void);

Button

Buttons gibt es in mehreren Ausprägungen. Die Basisklasse ist QButton. Der typische Druckknopf ist ein QPushButton.

Checkbox

Die Checkbox ist ein Button der nichts auslöst, sondern einen Haken besitzt und damit einen booleschen Wert visualisiert. Der Konstruktor erhält als Parameter die Beschriftung und das Elternwidget.
QCheckBox(const QString& text, Qwidget* parent);
Methoden Signale

Radio-Button

Ein Radiobutton erhält im Konstruktor seine Beschriftung und sein Elternwidget.
QRadioButton(const QString &text,QWidget *parent);
Methoden Signale

Eingabezeile QLineEdit

QLineEdit *edit = new QLineEdit();

Liste QListBox

QListBox(QWidget* parent=0,const char* name=0,WFlags f=0);
Methoden Signale und Slots

Das Hauptfenster QMainWindow

QMainWindow ist eine Klasse für ein Hauptfenster. Dieses ist darauf vorbereitet ein Menü und andere Dinge einzubauen. In der Regel wird man eine eigene Klasse definieren und diese von QMainWindow ableiten.

Das zentrale Widget

Für den Inhalt des Hauptfensters wird ein QWidget über die Methode setCentralWidget als zentrales Widget eingesetzt. Dieses kann dann ein eigenes Layout haben. Direkt mit dem Layout auf das MainWindow loszugehen ist zwecklos.
QGridLayout grid = new QGridLayout(this);
grid->addWidget(btSehen);
// ...
QWidget *central = new QWidget();
central->setLayout(grid);
setCentralWidget(central);

Menüs

Ein Menü besteht aus einer Menuleiste (MenuBar), mehreren Menüs (Menu) wie etwa das Datei- oder das Hilfemenü und mehreren Menüpunkten (Action), die im Prinzip Buttons sind. Die Klasse QMainWindow stellt die Methode addMenu zur Verfügung, um Menüs einzuhängen, Die Klasse QMenu stellt die Methode addMenu zur Verfügung, um Menüpunkte einzuhängen:
QAction *quit = new QAction("&Quit", this);
QMenu *datei;
datei = menuBar()->addMenu("&Datei");
datei->addAction(quit);
Um den Menüpunkt zu bedienen, muss ein connect definiert werden.
connect(quit, &QAction::triggered, &app, QApplication::quit);
http://zetcode.com/gui/qt5/menusandtoolbars/