- Ein nacktes Fenster - QWidget
- Layouts
- Signale und Slots
- Kontrollelemente, Widgets
- Das Hauptfenster QMainWindow
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
- show()
- resize(int width, int height)
- setWindowTitle(QString title)
- setLayout(QLayout* layout)
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:- Widgets werden horizontal durch Klasse QHBoxLayout angeordnet
- Widgets werden vertikal durch Klasse QVBoxLayout angeordnet
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_HIm folgenden Listing wird der Konstruktor von Rahmen dargestellt. Darin wird die Methode connect aufgerufen. Die Parameter sind:
- das Widget, das das Ereignis auslöst
- das Signal, das weitergeleitet wird
- das Objekt, das den Slot zur Verfügung stellt
- der Slot und damit die Methode, die das Ereignis fängt
#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
- setText(QString &text);
- QString text() const;
- virtual void setAlignment(int alignm);
- void setIndent(int indentation);
- int indent(void) const; ...
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.- QString s = button.text();
- button.setText(const QString&);
- button.setEnabled(false);
- bool ok = button.isEnabled();
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
- bool isChecked() const;
- void setChecked(bool check); ...
- virtual void setText(const QString& text);
- QString text() const;
- void pressed();
- void toggled(bool on);
Radio-Button
Ein Radiobutton erhält im Konstruktor seine Beschriftung und sein Elternwidget.QRadioButton(const QString &text,QWidget *parent);Methoden
- bool isChecked() const; ...
- virtual void setChecked(bool ch);
- QButtonGroup* group() const; // legt eine Buttongruppe an
- void clicked();
- void stateChanged(int);
Eingabezeile QLineEdit
QLineEdit *edit = new QLineEdit();
Liste QListBox
QListBox(QWidget* parent=0,const char* name=0,WFlags f=0);Methoden
- void insertItem(const QString& text, int index=-1);
- void insertItem(const QPixmap& pixmap, int index=-1 );
- void changeItem(const QString& text, int index);
- virtual void setCurrentItem(int index);
- int currentItem() const;
- QString currentText(void) const;
- QString text(int index) const;
- void clear(void);
- void selected(int index);
- virtual void clearSelection(void);
- void selectAll(bool select);
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/