Combo Boxes in Item Views

From Qt Wiki
Revision as of 08:16, 4 March 2015 by AutoSpider (talk | contribs) (Convert ExpressionEngine links)
Jump to: navigation, search
English | Deutsch

Combo Boxes in Item Views

Sample code to use combo boxes as editor widgets in an item view or item widget.

The delegate creates a combo box if the index is in the second column of a list view. For the other columns it just returns the default editor, that QStyledItemDelegate creates.

File itemdelegate.h

// —— File itemdelegate.h ——

  1. ifndef ITEMDELEGATE_H
  2. define ITEMDELEGATE_H
  1. include <QStyledItemDelegate>

class ComboBoxItemDelegate : public QStyledItemDelegate {

Q_OBJECT

public:

ComboBoxItemDelegate(QObject *parent = 0);
~ComboBoxItemDelegate();

virtual QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const;

virtual void setEditorData ( QWidget *editor, const QModelIndex &index ) const;
virtual void setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const;

};

  1. endif // ITEMDELEGATE_H

File itemdelegate.cpp

// —— File itemdelegate.cpp ——

  1. include "itemdelegate.h"
  2. include <QComboBox>

ComboBoxItemDelegate::ComboBoxItemDelegate(QObject parent)

: QStyledItemDelegate(parent)

{ }


ComboBoxItemDelegate::~ComboBoxItemDelegate() { }


QWidget ComboBoxItemDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const {

// ComboBox ony in column 2
if(index.column() != 1)
return QStyledItemDelegate::createEditor(parent, option, index);

// Create the combobox and populate it

QComboBox *cb = new QComboBox(parent);
int row = index.row();
cb->addItem(QString("one in row %1").arg(row));
cb->addItem(QString("two in row %1").arg(row));
cb->addItem(QString("three in row %1").arg(row));
return cb;

}

void ComboBoxItemDelegate::setEditorData ( QWidget *editor, const QModelIndex &index ) const {

if(QComboBox cb = qobject_cast<QComboBox>(editor)) {
// get the index of the text in the combobox that matches the current value of the itenm
QString currentText = index.data(Qt::EditRole).toString();
int cbIndex = cb->findText(currentText);
// if it is valid, adjust the combobox
if(cbIndex >= 0)
cb->setCurrentIndex(cbIndex);
} else {
QStyledItemDelegate::setEditorData(editor, index);
}

}

void ComboBoxItemDelegate::setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const {

if(QComboBox cb = qobject_cast<QComboBox>(editor))
// save the current text of the combo box as the current value of the item
model->setData(index, cb->currentText(), Qt::EditRole);
else
QStyledItemDelegate::setModelData(editor, model, index);

}

File main.cpp

// —— File main.cpp ——

  1. include <QApplication>
  2. include <QTableWidget>
  1. include "itemdelegate.h"

int main(int argc, char *argv[]) {

QApplication a(argc, argv);
QTableWidget tw;

ComboBoxItemDelegate *cbid = new ComboBoxItemDelegate(&tw);

tw.setItemDelegate(cbid);
tw.setColumnCount(4);
tw.setRowCount(10);
tw.resize(600,400);
tw.show();

return a.exec(); }