[FAQ] QTableWidget Tipps und Tricks, Delegates

Archiv häufig gestellter Fragen zum Thema Qt
Antworten
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

[FAQ] QTableWidget Tipps und Tricks, Delegates

Beitrag von FlorianBecker »

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: Alles auswählen

QTableWidget *table = new QTableWidget( 5, 20, this );
layout -> addWidget( table );
Wie ändere ich die Header in einem QTableWidget?
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 );
Pro Feld, zur Laufzeit - oberer Header:

Code: Alles auswählen

table -> setHorizontalHeaderItem( 0, new QTableWidgetItem( tr( "Oben 1" ) ) );
Pro Feld, zur Laufzeit - linker Header:

Code: Alles auswählen

table -> setVerticalHeaderItem( 0, new QTableWidgetItem( tr( "Links 1" ) ) );
Wie erstelle ich eine CheckBox?

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 )
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: 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() ) ); }
*.h Definitionen:

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();
};
Wo stehen die Informationen von Trolltech dazu?
http://doc.trolltech.com/4.0/qtablewidget.html
http://doc.trolltech.com/4.0/qitemdelegate.html
Antworten