FlorianBecker
Anmeldedatum: 02.12.2004 Beiträge: 1213 Wohnort: Alzey
|
Verfasst am: Mi Aug 24, 2005 9:00 Titel: [FAQ] QTableWidget Tipps und Tricks, Delegates |
|
|
Was ist ein QTableWidget?
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: | QTableWidget *table = new QTableWidget( 5, 20, this );
layout -> addWidget( table ); |
Wie ändere ich die Header in einem QTableWidget?
Mit einer Liste:
| Code: | 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 ); |
Pro Feld, zur Laufzeit - oberer Header:
| Code: | | table -> setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "Oben 1" ) ) ); |
Pro Feld, zur Laufzeit - linker Header:
| Code: | | table -> setVerticalHeaderItem( 0, new QTableWidgetItem( tr( "Links 1" ) ) ); |
Wie erstelle ich eine CheckBox?
| Code: | QTableWidgetItem *item = new QTableWidgetItem( tr( "Checkbox" ) );
item -> setFlags( Qt::ItemIsUserCheckable );
// Geklickt
item -> setCheckState( Qt::Checked )
// Nicht geklickt
item -> setCheckState( Qt::Unchecked ) |
Was sind Delegates und wie erstelle ich eine ComboBox?
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: | 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() ) ); } |
*.h Definitionen:
| Code: | 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();
}; |
Wo stehen die Informationen von Trolltech dazu?
http://doc.trolltech.com/4.0/qtablewidget.html
http://doc.trolltech.com/4.0/qitemdelegate.html _________________
 |
|