Gitterlayout

Mittels QGridLayout können wir Widgets in einem Gitter ausrichten. Dafür können wir in der addWidget()-Methode zusätzlich die Spalte und Zeile des Widgets angeben:

void QGridLayout::addWidget( QWidget *widget, int row, int column,
                             Qt::Alignment alignment = Qt::Alignment() )

widget: Das einzufügende Widget
row: Zeile, in die das Widget eingefügt werden soll (beginnend bei 0)
column: Spalte, in die das Widget eingefügt werden soll (beginnend bei 0)
alignment: Ausrichtung des Widgets innerhalb der Zelle; Gibt man keinen Wert an, füllt das Widget die ganze Zelle.

Wir können Widgets aber auch auf mehrere Zellen ausdehnen:

void QGridLayout::addWidget( QWidget *widget, int fromRow, int fromColumn, 
                             int rowSpan, int columnSpan,
                             Qt::Alignment alignment = Qt::Alignment() )

widget: Das einzufügende Widget
fromRow: Startzeile des Widgets (beginnend bei 0)
fromColumn: Startspalte des Widgets (beginnend bei 0)
rowSpan: Anzahl der ganzen Zeilen über das sich das Widget ausdehnt (bei 0 nur die aktuelle Zelle)
columnSpan: Anzahl der ganzen Spalten über das sich das Widget ausdehnt (bei 0 nur die aktuelle Zelle)
alignment: Ausrichtung des Widgets innerhalb der Zelle; Gibt man keinen Wert an füllt das Widget die ganze Zelle.

Die Dimensionen des Layouts können wir mit rowCount() und columnCount() abfragen:

int QGridLayout::columnCount() const
int QGridLayout::rowCount() const

Beide Methoden geben erwartungsgemäß die Anzahl der Zeilen bzw. Spalten zurück.

Mit den genannten Funktionen sollte es kein Problem sein ein Gitter aus Buttons mit einer über die erste Zeile ausgedehnten Überschrift zu erstellen. Die erste Spalte soll dabei frei gelassen werden. Der Text der Buttons ist die jeweilige Position im Layout.

#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QPushButton>
#include <QLabel>
 
int main( int argc, char *argv[] )
{
  QApplication app( argc, argv );
  QWidget w;
  QGridLayout *layout;
 
  // Layout anlegen
  layout = new QGridLayout();
 
  // Label mit Überschrift dehnt sich über die ganze erste Zeile aus
  layout->addWidget( new QLabel( "<h1>Raster aus Buttons</h1>" ), 0, 0, 1, 0 );
 
  // 4*4-Matrix aus Buttons mit den Zellen-Koordinaten als Text erstellen
  // Zeile 0 wird bereits von der Überschrift belegt, deswegen wird bei 1 begonnen
  for( int i = 1; i < 5; i++ )
  {
    // Erste Spalte (Index 0) bleibt frei, deswegen wird wieder bei 1 begonnen
    for( int j = 1; j < 5; j++ )
    {
      // Neuen Button an der Position i/j einfügen
      layout->addWidget( new QPushButton( QString( "%1/%2" )
                                             .arg( QString::number( i ),
                                                   QString::number( j ) ) ),
                         i, j );
    }
  }
 
  // Layout anwenden und Widget anzeigen
  w.setWindowTitle( "GridLayout" );
  w.setLayout( layout );
  w.show();
 
  return app.exec();
}