Difference between revisions of "Combo Boxes in Item Views"

From Qt Wiki
Jump to: navigation, search
Line 7: Line 7:
 
Sample code to use combo boxes as editor widgets in an item view or item widget.
 
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.
+
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
 
File itemdelegate.h
  
<code><br />// —— File itemdelegate.h ——<br />#ifndef ITEMDELEGATE_H<br />#define ITEMDELEGATE_H
+
<code>
 +
// —— File itemdelegate.h ——
 +
#ifndef ITEMDELEGATE_H
 +
#define ITEMDELEGATE_H
  
#include &lt;QStyledItemDelegate&amp;gt;
+
#include <QStyledItemDelegate>
  
class ComboBoxItemDelegate : public QStyledItemDelegate<br />{<br /> Q_OBJECT
+
class ComboBoxItemDelegate : public QStyledItemDelegate
 +
{
 +
Q_OBJECT
  
public:<br /> ComboBoxItemDelegate(QObject *parent = 0);<br /> ~ComboBoxItemDelegate();
+
public:
 +
ComboBoxItemDelegate(QObject *parent = 0);
 +
~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;
+
virtual QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &amp;option, const QModelIndex &amp;index ) const;
 +
virtual void setEditorData ( QWidget *editor, const QModelIndex &amp;index ) const;
 +
virtual void setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &amp;index ) const;
  
 
};
 
};
  
#endif // ITEMDELEGATE_H<br /></code>
+
#endif // ITEMDELEGATE_H
 +
</code>
  
 
File itemdelegate.cpp
 
File itemdelegate.cpp
  
<code><br />// —— File itemdelegate.cpp ——<br />#include &quot;itemdelegate.h&amp;quot;<br />#include &lt;QComboBox&amp;gt;
+
<code>
 +
// —— File itemdelegate.cpp ——
 +
#include "itemdelegate.h"
 +
#include <QComboBox>
  
ComboBoxItemDelegate::ComboBoxItemDelegate(QObject '''parent)<br /> : QStyledItemDelegate(parent)<br />{<br />}
+
ComboBoxItemDelegate::ComboBoxItemDelegate(QObject '''parent)
 +
: QStyledItemDelegate(parent)
 +
{
 +
}
  
<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);
+
ComboBoxItemDelegate::~ComboBoxItemDelegate()
 +
{
 +
}
  
// 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 />}
+
QWidget''' ComboBoxItemDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &amp;option, const QModelIndex &amp;index ) const
 +
{
 +
// ComboBox ony in column 2
 +
if(index.column() != 1)
 +
return QStyledItemDelegate::createEditor(parent, option, index);
  
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 /></code>
+
// 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 &amp;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 &amp;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);
 +
}
 +
</code>
  
 
File main.cpp
 
File main.cpp
  
<code><br />// —— File main.cpp ——<br />#include &lt;QApplication&amp;gt;<br />#include &lt;QTableWidget&amp;gt;
+
<code>
 +
// —— File main.cpp ——
 +
#include <QApplication>
 +
#include <QTableWidget>
  
#include &quot;itemdelegate.h&amp;quot;
+
#include "itemdelegate.h"
  
int main(int argc, char *argv[])<br />{<br /> QApplication a(argc, argv);<br /> QTableWidget tw;
+
int main(int argc, char *argv[])
 +
{
 +
QApplication a(argc, argv);
 +
QTableWidget tw;
  
ComboBoxItemDelegate *cbid = new ComboBoxItemDelegate(&amp;tw);<br /> tw.setItemDelegate(cbid);<br /> tw.setColumnCount(4);<br /> tw.setRowCount(10);<br /> tw.resize(600,400);<br /> tw.show();
+
ComboBoxItemDelegate *cbid = new ComboBoxItemDelegate(&amp;tw);
 +
tw.setItemDelegate(cbid);
 +
tw.setColumnCount(4);
 +
tw.setRowCount(10);
 +
tw.resize(600,400);
 +
tw.show();
  
return a.exec&amp;amp;#40;&amp;#41;;<br />}
+
return a.exec();
 +
}

Revision as of 09:02, 25 February 2015


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

File itemdelegate.h

// —— File itemdelegate.h ——
#ifndef ITEMDELEGATE_H
#define ITEMDELEGATE_H

#include <QStyledItemDelegate>

class ComboBoxItemDelegate : public QStyledItemDelegate
{
 Q_OBJECT

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

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

};

#endif // ITEMDELEGATE_H

File itemdelegate.cpp

// —— File itemdelegate.cpp ——
#include "itemdelegate.h"
#include <QComboBox>

ComboBoxItemDelegate::ComboBoxItemDelegate(QObject '''parent)
 : QStyledItemDelegate(parent)
{
}


ComboBoxItemDelegate::~ComboBoxItemDelegate()
{
}


QWidget''' ComboBoxItemDelegate::createEditor( QWidget *parent, const QStyleOptionViewItem &amp;option, const QModelIndex &amp;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 &amp;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 &amp;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(); }