Combo Boxes in Item Views

From Qt Wiki
Revision as of 14:38, 23 February 2015 by Maintenance script (talk | contribs)
Jump to navigation Jump to search


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":http://doc.qt.io/qt-5.0/qtwidgets/qstyleditemdelegate.html creates.

File itemdelegate.h

<br />// —— File itemdelegate.h ——<br />#ifndef ITEMDELEGATE_H<br />#define ITEMDELEGATE_H

#include &lt;QStyledItemDelegate&amp;gt;

class ComboBoxItemDelegate : public QStyledItemDelegate<br />{<br /> Q_OBJECT

public:<br /> ComboBoxItemDelegate(QObject *parent = 0);<br /> ~ComboBoxItemDelegate();

virtual QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &amp;option, const QModelIndex &amp;index ) const;<br /> virtual void setEditorData ( QWidget *editor, const QModelIndex &amp;index ) const;<br /> virtual void setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &amp;index ) const;

};

#endif // ITEMDELEGATE_H<br />

File itemdelegate.cpp

<br />// —— File itemdelegate.cpp ——<br />#include &quot;itemdelegate.h&amp;quot;<br />#include &lt;QComboBox&amp;gt;

ComboBoxItemDelegate::ComboBoxItemDelegate(QObject '''parent)<br /> : QStyledItemDelegate(parent)<br />{<br />}

<br />ComboBoxItemDelegate::~ComboBoxItemDelegate()<br />{<br />}

<br />QWidget''' ComboBoxItemDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &amp;option, const QModelIndex &amp;index ) const<br />{<br /> // ComboBox ony in column 2<br /> if(index.column() != 1)<br /> return QStyledItemDelegate::createEditor(parent, option, index);

// Create the combobox and populate it<br /> QComboBox *cb = new QComboBox(parent);<br /> int row = index.row();<br /> cb-&gt;addItem(QString(&quot;one in row %1&amp;quot;).arg(row));<br /> cb-&gt;addItem(QString(&quot;two in row %1&amp;quot;).arg(row));<br /> cb-&gt;addItem(QString(&quot;three in row %1&amp;quot;).arg(row));<br /> return cb;<br />}

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

void ComboBoxItemDelegate::setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &amp;index ) const<br />{<br /> if(QComboBox '''cb = qobject_cast&amp;lt;QComboBox'''&gt;(editor))<br /> // save the current text of the combo box as the current value of the item<br /> model-&gt;setData(index, cb-&gt;currentText(), Qt::EditRole);<br /> else<br /> QStyledItemDelegate::setModelData(editor, model, index);<br />}<br />

File main.cpp


// —— File main.cpp ——
#include <QApplication&gt;
#include <QTableWidget&gt;

  1. include "itemdelegate.h&quot;

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&amp;#40;&#41;;
}