Das QTableWidget ist in dem item/model based System von Qt4 eine Tabelle, die Item basiert viele Zellen verwaltet. Ein einfaches QTableWidget mit 5 Spalten und 20 Zeilen könnte so aussehen:
Code: Alles auswählen
QTableWidget *table = new QTableWidget( 5, 20, this );
layout -> addWidget( table );
Mit einer Liste:
Code: Alles auswählen
QStringList hheader;
hheader << tr( "Oben 1" ) << tr( "Oben 2" ) << tr( "Oben 3" ) << tr( "Oben 4" ) << tr( "Oben 5" );
table -> setHorizontalHeaderLabels( hheader4 );
QStringList vheader;
vheader << tr( "Links 1" ) << tr( "Links 2" ) << tr( "Links 3" ) << tr( "Links 4" );
...
table -> setVerticalHeaderLabels( vheader );
Code: Alles auswählen
table -> setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "Oben 1" ) ) );
Code: Alles auswählen
table -> setVerticalHeaderItem( 0, new QTableWidgetItem( tr( "Links 1" ) ) );
Code: Alles auswählen
QTableWidgetItem *item = new QTableWidgetItem( tr( "Checkbox" ) );
item -> setFlags( Qt::ItemIsUserCheckable );
// Geklickt
item -> setCheckState( Qt::Checked )
// Nicht geklickt
item -> setCheckState( Qt::Unchecked )
Das größte Problem von einem Delegate ist, dass er die komplette Tabelle mit seinem Widget übernimmt. Normalerweise sollte aber nur bestimmte Felder oder bestimmte Spalten dieses Widget benutzen. Das Beispiel kann auf jedes beliebige Widget angewendet werden.
ComboBox nur in der 2. Spalte, restliche Felder gehen aber weiterhin auf den normalen LineEdit.
1. Reimplementieren der Klasse QItemDelegate *.cpp Source:
Code: Alles auswählen
ComboBoxDelegate::ComboBoxDelegate( QObject *parent )
: QItemDelegate( parent ) {}
QWidget *ComboBoxDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const {
if ( index.column() == 2 ) {
QComboBox *combo = new QComboBox( parent );
// Hier die ComboBox mit Daten füllen!!!
connect( combo, SIGNAL( activated( int ) ), this, SLOT( emitCommitData() ) );
return combo;
} else
return QItemDelegate::createEditor( parent, option, index ); // Extrem wichtig, sonst kommt man nicht mehr zurück.
}
void ComboBoxDelegate::setEditorData( QWidget *editor, const QModelIndex &index ) const {
QComboBox *combo = qobject_cast<QComboBox *>( editor );
if ( !combo ) {
QItemDelegate::setEditorData( editor, index ); // Extrem wichtig, sonst kommt man nicht mehr zurück.
return;
}
int pos = combo -> findText( index.model() -> data( index ).toString(), Qt::MatchExactly );
combo -> setCurrentIndex( pos );
}
void ComboBoxDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const {
QComboBox *combo = qobject_cast<QComboBox *>( editor );
if ( !combo ) {
QItemDelegate::setModelData( editor, model, index ); // Extrem wichtig, sonst kommt man nicht mehr zurück.
return;
}
model -> setData( index, combo -> currentText() );
}
void ComboBoxDelegate::emitCommitData() { emit commitData( qobject_cast<QWidget *>( sender() ) ); }
Code: Alles auswählen
class ComboBoxDelegate : public QItemDelegate {
Q_OBJECT
public:
ComboBoxDelegate( QObject *parent = 0 );
QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const;
void setEditorData( QWidget *editor, const QModelIndex &index ) const;
void setModelData( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const;
private slots:
void emitCommitData();
};
http://doc.trolltech.com/4.0/qtablewidget.html
http://doc.trolltech.com/4.0/qitemdelegate.html