====== Tabellen ======
''QTableWidget'' ist zwar kein Layout, mit dieser Klasse sich Daten aber recht praktisch in einer Tabelle darstellen. Das besondere an diesem Widget ist, dass neben Text auch Widgets dargestellt werden können.
===== Tabelle anzeigen =====
Bevor wir die Tabelle noch mit Daten füllen, wollen wir sie erstmal anzeigen:
// main.cpp
#include
#include
#include
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
QTableWidget table;
// Größe festlegen
table.setRowCount( 5 );
table.setColumnCount( 5 );
// Stellt sicher, dass die Tabelle komplett dargestellt wird und keine
// Scrollbalken verwendet werden
table.setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
table.horizontalHeader()->setResizeMode( QHeaderView::Stretch );
// Titel setzen und Widget anzeigen
table.setWindowTitle( "QTableWidget" );
table.show();
return app.exec();
}
\\
{{:frameworks:qt:gui:basic:layouts:showtable.png|}}
\\
===== Texte im Rahmen setzen oder verstecken =====
Im Obigen Beispiel sehen wir, dass am oberen und linken Rand automatisch Beschriftungen verwendet werden. Diese sind nicht schön, aber können leicht verändert werden:
// main.cpp
#include
#include
#include
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
QTableWidget table;
// Größe festlegen
table.setRowCount( 5 );
table.setColumnCount( 5 );
// Labels setzen
QStringList hLabels, vLabels;
hLabels << "H1" << "H2" << "H3" << "H4" << "H5";
vLabels << "V1" << "V2" << "V3" << "V4" << "V5";
table.setHorizontalHeaderLabels( hLabels );
table.setVerticalHeaderLabels( vLabels );
// Stellt sicher, dass die Tabelle komplett dargestellt wird und keine
// Scrollbalken verwendet werden
table.setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
table.horizontalHeader()->setResizeMode( QHeaderView::Stretch );
// Titel setzen und Widget anzeigen
table.setWindowTitle( "QTableWidget" );
table.show();
return app.exec();
}
\\
{{:frameworks:qt:gui:basic:layouts:tableheaders.png|}}
\\
\\
Wir können diese Balken natürlich auch komplett ausblenden:
// main.cpp
#include
#include
#include
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
QTableWidget table;
// Größe festlegen
table.setRowCount( 5 );
table.setColumnCount( 5 );
// Balken verstecken
table.horizontalHeader()->setVisible( false );
table.verticalHeader()->setVisible( false );
// Stellt sicher, dass die Tabelle komplett dargestellt wird und keine
// Scrollbalken verwendet werden
table.setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
table.horizontalHeader()->setResizeMode( QHeaderView::Stretch );
// Titel setzen und Widget anzeigen
table.setWindowTitle( "QTableWidget" );
table.show();
return app.exec();
}
\\
{{:frameworks:qt:gui:basic:layouts:noheadertable.png|}}
\\
===== Text in eine Zelle einfügen =====
Als nächstes wollen wir Text in die Zellen einfügen. Wir machen es uns einfach und schreiben als Ergebnis einfach das Produkt aus Zeilen- und Spaltenindex in die Zelle. Um Text in eine Zelle einzufügen, muss ein ''QTableWidgetItem'' über die Methode ''setItem()'' gesetzt werden.
// main.cpp
#include
#include
#include
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
QTableWidget table;
// Größe festlegen
table.setRowCount( 5 );
table.setColumnCount( 5 );
// Zellen mit Produkten als Text füllen
for( int i = 0; i < table.rowCount(); i++ )
{
for( int j = 0; j < table.columnCount(); j++ )
table.setItem( i, j, new QTableWidgetItem( QString::number( ( i + 1 ) * ( j + 1) ) ) );
}
// Stellt sicher, dass die Tabelle komplett dargestellt wird und keine
// Scrollbalken verwendet werden
table.setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
table.horizontalHeader()->setResizeMode( QHeaderView::Stretch );
// Titel setzen und Widget anzeigen
table.setWindowTitle( "QTableWidget" );
table.show();
return app.exec();
}
\\
{{:frameworks:qt:gui:basic:layouts:tableproduct.png|}}
\\
===== Widgets in eine Zelle einfügen =====
Neben Text kann eine Tabelle auch Widgets enthalten, die darin ganz normal dargestellt werden. Ähnlich wie mit ''setItem()'', wird über ''setCellWidget()'' das Widget einer Zelle gesetzt. Natürlich kann man das innerhalb einer Tabelle mischen, wobei eine Zelle logischerweise nur einen Text bzw. ein Widget beinhalten kann. Als Beispiel konstruieren wir folgende Tabelle:
* 1. Spalte: Zeilennummer als Text
* 2. Spalte: Zeilennummer als Button
* 3. Spalte: Zeilennummer * 10 als Fortschrittsbalken
* 4. Spalte: ''QSpinBox'' mit Zeilennummer als Wert
* 5. Spalte: Label mit Zeilennummer als fetter, grüner Text
Code:
// main.cpp
#include
#include
#include
#include
#include
#include
#include
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
QTableWidget table;
// Größe festlegen
table.setRowCount( 5 );
table.setColumnCount( 5 );
// 1. Spalte: Zeilennummer als Text
for( int i = 0; i < table.rowCount(); i++ )
table.setItem( i, 0, new QTableWidgetItem( QString::number( i + 1 ) ) );
// 2. Spalte: Zeilennummer als Button
for( int i = 0; i < table.rowCount(); i++ )
table.setCellWidget( i, 1, new QPushButton( QString::number( i + 1 ) ) );
// 3. Spalte: Zeilennummer * 10 als Fortschrittsbalken
for( int i = 0; i < table.rowCount(); i++ )
{
QProgressBar *pBar = new QProgressBar();
pBar->setValue( ( i + 1 ) * 10 );
table.setCellWidget( i, 2, pBar );
}
// 4. Spalte: ''QSpinBox'' mit Zeilennummer als Wert
for( int i = 0; i < table.rowCount(); i++ )
{
QSpinBox *spinBox = new QSpinBox();
spinBox->setMinimum( 0 );
spinBox->setMaximum( 100 );
spinBox->setValue( i + 1 );
table.setCellWidget( i, 3, spinBox );
}
// 5. Spalte: Label mit Zeilennummer als fetter, grüner Text
for( int i = 0; i < table.rowCount(); i++ )
{
QLabel *label = new QLabel();
label->setText( "" + QString::number( i + 1 ) + "" );
table.setCellWidget( i, 4, label );
}
// Stellt sicher, dass die Tabelle komplett dargestellt wird und keine
// Scrollbalken verwendet werden
table.setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
table.horizontalHeader()->setResizeMode( QHeaderView::Stretch );
// Titel setzen und Widget anzeigen
table.setWindowTitle( "QTableWidget" );
table.show();
return app.exec();
}
\\
{{:frameworks:qt:gui:basic:layouts:widgettable.png|}}
\\
===== Abschließendes =====
Damit haben wir auch schon die wichtigsten Funktionalitäten von Tabellen geklärt. ''QTableWidget'' ist zwar kein Layout, trotzdem eine sehr mächtige Klasse zur Darstellung von Daten.