Difference between revisions of "Combo Boxes in Item Views"

From Qt Wiki
Jump to: navigation, search
m (Added nullptr and override)
(Adjusted to current Qt style)
 
(2 intermediate revisions by one other user not shown)
Line 5: Line 5:
 
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 {{DocLink|QStyledItemDelegate}} 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 {{DocLink|QStyledItemDelegate}} creates.
  
File itemdelegate.h
+
File comboboxitemdelegate.h
  
 
<code>
 
<code>
Line 17: Line 17:
 
     Q_OBJECT
 
     Q_OBJECT
 
public:
 
public:
     ComboBoxItemDelegate(QObject* parent= Q_NULLPTR);
+
     ComboBoxItemDelegate(QObject *parent = nullptr);
 
     ~ComboBoxItemDelegate();
 
     ~ComboBoxItemDelegate();
  
     QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const Q_DECL_OVERRIDE;
+
     QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
     void setEditorData(QWidget* editor, const QModelIndex& index) const Q_DECL_OVERRIDE;
+
     void setEditorData(QWidget *editor, const QModelIndex &index) const override;
     void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const Q_DECL_OVERRIDE;
+
     void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
 
};
 
};
  
Line 28: Line 28:
 
</code>
 
</code>
  
File itemdelegate.cpp
+
File comboboxitemdelegate.cpp
  
 
<code>
 
<code>
#include "itemdelegate.h"
+
#include "comboboxitemdelegate.h"
 
#include <QComboBox>
 
#include <QComboBox>
  
ComboBoxItemDelegate::ComboBoxItemDelegate(QObject* parent)
+
ComboBoxItemDelegate::ComboBoxItemDelegate(QObject *parent)
 
     : QStyledItemDelegate(parent)
 
     : QStyledItemDelegate(parent)
 
{
 
{
Line 45: Line 45:
  
  
QWidget* ComboBoxItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
+
QWidget *ComboBoxItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
 
{
 
{
 
     // Create the combobox and populate it
 
     // Create the combobox and populate it
     QComboBox* cb = new QComboBox(parent);
+
     QComboBox *cb = new QComboBox(parent);
     int row = index.row();
+
     const int row = index.row();
 
     cb->addItem(QString("one in row %1").arg(row));
 
     cb->addItem(QString("one in row %1").arg(row));
 
     cb->addItem(QString("two in row %1").arg(row));
 
     cb->addItem(QString("two in row %1").arg(row));
Line 57: Line 57:
  
  
void ComboBoxItemDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
+
void ComboBoxItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
 
{
 
{
     QComboBox* cb = qobject_cast<QComboBox*>(editor);
+
     QComboBox *cb = qobject_cast<QComboBox *>(editor);
 
     Q_ASSERT(cb);
 
     Q_ASSERT(cb);
     // get the index of the text in the combobox that matches the current value of the itenm
+
     // get the index of the text in the combobox that matches the current value of the item
     QString currentText = index.data(Qt::EditRole).toString();
+
     const QString currentText = index.data(Qt::EditRole).toString();
     int cbIndex = cb->findText(currentText);
+
     const int cbIndex = cb->findText(currentText);
 
     // if it is valid, adjust the combobox
 
     // if it is valid, adjust the combobox
 
     if (cbIndex >= 0)
 
     if (cbIndex >= 0)
Line 70: Line 70:
  
  
void ComboBoxItemDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
+
void ComboBoxItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
 
{
 
{
     QComboBox* cb = qobject_cast<QComboBox*>(editor);
+
     QComboBox *cb = qobject_cast<QComboBox *>(editor);
 
     Q_ASSERT(cb);
 
     Q_ASSERT(cb);
 
     model->setData(index, cb->currentText(), Qt::EditRole);
 
     model->setData(index, cb->currentText(), Qt::EditRole);
Line 85: Line 85:
 
#include <QTableWidget>
 
#include <QTableWidget>
  
#include "itemdelegate.h"
+
#include "comboboxitemdelegate.h"
  
 
int main(int argc, char *argv[])
 
int main(int argc, char *argv[])
Line 93: Line 93:
  
 
     ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(&tw);
 
     ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(&tw);
     // ComboBox ony in column 2  
+
     // ComboBox only in column 2  
 
     tw.setItemDelegateForColumn(1, cbid);
 
     tw.setItemDelegateForColumn(1, cbid);
 
     tw.setColumnCount(4);
 
     tw.setColumnCount(4);

Latest revision as of 13:13, 5 February 2019

En Ar Bg De El Es Fa Fi Fr Hi Hu It Ja Kn Ko Ms Nl Pl Pt Ru Sq Th Tr Uk Zh

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 comboboxitemdelegate.h

#ifndef COMBOBOXITEMDELEGATE_H
#define COMBOBOXITEMDELEGATE_H

#include <QStyledItemDelegate>

class ComboBoxItemDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    ComboBoxItemDelegate(QObject *parent = nullptr);
    ~ComboBoxItemDelegate();

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

#endif // COMBOBOXITEMDELEGATE_H

File comboboxitemdelegate.cpp

#include "comboboxitemdelegate.h"
#include <QComboBox>

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


ComboBoxItemDelegate::~ComboBoxItemDelegate()
{
}


QWidget *ComboBoxItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    // Create the combobox and populate it
    QComboBox *cb = new QComboBox(parent);
    const 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
{
    QComboBox *cb = qobject_cast<QComboBox *>(editor);
    Q_ASSERT(cb);
    // get the index of the text in the combobox that matches the current value of the item
    const QString currentText = index.data(Qt::EditRole).toString();
    const int cbIndex = cb->findText(currentText);
    // if it is valid, adjust the combobox
    if (cbIndex >= 0)
       cb->setCurrentIndex(cbIndex);
}


void ComboBoxItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QComboBox *cb = qobject_cast<QComboBox *>(editor);
    Q_ASSERT(cb);
    model->setData(index, cb->currentText(), Qt::EditRole);
}


File main.cpp

#include <QApplication>
#include <QTableWidget>

#include "comboboxitemdelegate.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTableWidget tw;

    ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(&tw);
    // ComboBox only in column 2 
    tw.setItemDelegateForColumn(1, cbid);
    tw.setColumnCount(4);
    tw.setRowCount(10);
    tw.resize(600,400);
    tw.show();

    return a.exec();
}