Combo Boxes in Item Views: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
(Adjusted to current Qt style) |
||
(10 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
{{LangSwitch}} | |||
[[Category:Snippets]] | [[Category:Snippets]] | ||
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 {{DocLink|QStyledItemDelegate}} creates. | |||
File comboboxitemdelegate.h | |||
<code> | |||
#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 | |||
</code> | |||
File comboboxitemdelegate.cpp | |||
<code> | |||
#include "comboboxitemdelegate.h" | |||
#include <QComboBox> | |||
} | ComboBoxItemDelegate::ComboBoxItemDelegate(QObject *parent) | ||
: QStyledItemDelegate(parent) | |||
{ | |||
} | |||
ComboBoxItemDelegate::~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:: | 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> | |||
File main.cpp | File main.cpp | ||
<code> | <code> | ||
#include <QApplication> | |||
#include <QTableWidget> | |||
#include | #include "comboboxitemdelegate.h" | ||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||
{ | |||
QApplication a(argc, argv); | |||
QTableWidget tw; | |||
ComboBoxItemDelegate *cbid = new ComboBoxItemDelegate(& | 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 | return a.exec(); | ||
} | |||
</code> |
Revision as of 13:13, 5 February 2019
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();
}