Combo Boxes in Item Views: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Cleanup)
(Checking index.column() in the delegate is bad design as it ties the delegate to a specific model, setItemDelegateForColumn should be used instead)
Line 47: Line 47:
QWidget* ComboBoxItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
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
     // Create the combobox and populate it
     QComboBox* cb = new QComboBox(parent);
     QComboBox* cb = new QComboBox(parent);
Line 63: Line 59:
void ComboBoxItemDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
void ComboBoxItemDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
{
{
     if (QComboBox* cb = qobject_cast<QComboBox*>(editor)) {
     QComboBox* cb = qobject_cast<QComboBox*>(editor);
      // get the index of the text in the combobox that matches the current value of the itenm
    Q_ASSERT(cb);
      QString currentText = index.data(Qt::EditRole).toString();
    // get the index of the text in the combobox that matches the current value of the itenm
      int cbIndex = cb->findText(currentText);
    QString currentText = index.data(Qt::EditRole).toString();
      // if it is valid, adjust the combobox
    int cbIndex = cb->findText(currentText);
      if (cbIndex >= 0)
    // if it is valid, adjust the combobox
          cb->setCurrentIndex(cbIndex);
    if (cbIndex >= 0)
    } else {
      cb->setCurrentIndex(cbIndex);
        QStyledItemDelegate::setEditorData(editor, index);
    }
}
}


Line 78: Line 72:
void ComboBoxItemDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
void ComboBoxItemDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
{
{
     if (QComboBox* cb = qobject_cast<QComboBox*>(editor))
     QComboBox* cb = qobject_cast<QComboBox*>(editor);
        // save the current text of the combo box as the current value of the item
    Q_ASSERT(cb);
        model->setData(index, cb->currentText(), Qt::EditRole);
    model->setData(index, cb->currentText(), Qt::EditRole);
    else
        QStyledItemDelegate::setModelData(editor, model, index);
}
}
</code>
</code>
Line 101: Line 93:


     ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(&tw);
     ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(&tw);
     tw.setItemDelegate(cbid);
    // ComboBox ony in column 2
     tw.setItemDelegateForColumn(1, cbid);
     tw.setColumnCount(4);
     tw.setColumnCount(4);
     tw.setRowCount(10);
     tw.setRowCount(10);

Revision as of 08:52, 5 December 2018

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 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& 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;
};

#endif // ITEMDELEGATE_H

File itemdelegate.cpp

#include "itemdelegate.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);
    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 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);
}


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 "itemdelegate.h"

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

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

    return a.exec();
}