Widget-Gruppen

Die Klasse QGroupBox ist zwar keine echte Layout-Klasse, sollte aber trotzdem in diesem Zusammenhang erwähnt werden. Wie der Name schon sagt, können damit Widgets zu einer Gruppe zusammengefasst werden, indem man sie in ein Layout packt und dieses auf die QGroupBox-Instanz anwendet.

Je nach grafischer Oberfläche erhält die Gruppe einen Rahmen, optional einen Titel und ebenfalls optional ein QCheckBox-ähnliches Widget zum aktivieren bzw. deaktivieren des Inhalts. Dadurch können z.B. nicht verfügbare Einstellungen in einem Dialog ausgegraut werden. Zur Aktivierung dieser Eigenschaft ist nur ein Aufruf der Methode setCheckable() nötig. Ob die Box aktivierbar ist, kann mit isCheckable() abgefragt werden. Der Zustand kann analog zu QCheckBox mit setChecked(), isChecked() und toggled() verwaltet werden.

Nun wollen wir einen Verbindungsdialog mit optionaler Eingabe eines Benutzernamens und eines Passworts erstellen. Wir werden uns an dieser Stelle nur auf die grafischen Komponenten konzentrieren (zumindest vorerst ;-)) und statt der Verbindungsherstellung das Programm einfach beenden.

#include <QApplication>
#include <QGroupBox>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
 
int main( int argc, char *argv[] )
{
  QApplication app( argc, argv );
  QWidget w;
  QPushButton *connectButton;
  QLineEdit *addressLineEdit, *usernameLineEdit, *pwLineEdit;
  QGroupBox *authBox;
  QVBoxLayout *layout, *authLayout;
 
  // Widgets und Layouts anlegen
  connectButton = new QPushButton( "Verbinden" );
  addressLineEdit = new QLineEdit();
  usernameLineEdit = new QLineEdit();
  pwLineEdit = new QLineEdit();
  authBox = new QGroupBox( "Authentifizierung erforderlich" );
  layout = new QVBoxLayout();
  authLayout = new QVBoxLayout();
 
  // Anstatt eine Verbindung herzustellen beendet unser Button das Programm
  QObject::connect( connectButton, &QPushButton::clicked,
                    &app, &QApplication::quit );
 
  // Passwort beim Tippen nicht anzeigen
  pwLineEdit->setEchoMode( QLineEdit::Password );
  // Widget-Gruppe kann aktiviert werden
  authBox->setCheckable( true );
  authBox->setChecked( false );
 
  // Widgets in den Layouts platzieren
  authLayout->addWidget( usernameLineEdit );
  authLayout->addWidget( pwLineEdit );
  authBox->setLayout( authLayout );
  layout->addWidget( addressLineEdit );
  layout->addWidget( authBox );
  layout->addWidget( connectButton );
 
  w.setWindowTitle( "Verbinden" );
  w.setLayout( layout );
  w.show();
 
  return app.exec();
}

Und so sieht das Programm nach aktivierter Authentifizierung und Eingabe aus: