Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.
Combo Boxes in Item Views: Difference between revisions
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 | ||
{ | { | ||
// 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 | ||
{ | { | ||
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); | |||
} | } | ||
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 | ||
{ | { | ||
QComboBox* cb = qobject_cast<QComboBox*>(editor); | |||
Q_ASSERT(cb); | |||
model->setData(index, cb->currentText(), Qt::EditRole); | |||
} | } | ||
</code> | </code> | ||
Line 101: | Line 93: | ||
ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(&tw); | ComboBoxItemDelegate* cbid = new ComboBoxItemDelegate(&tw); | ||
tw. | // 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
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();
}