Combo Boxes in Item Views: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
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 | 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> | <code> | ||
// —— File itemdelegate.h —— | |||
#ifndef ITEMDELEGATE_H | |||
#define ITEMDELEGATE_H | |||
#include | #include <QStyledItemDelegate> | ||
class ComboBoxItemDelegate : public QStyledItemDelegate | class ComboBoxItemDelegate : public QStyledItemDelegate | ||
{ | |||
Q_OBJECT | |||
public: | public: | ||
ComboBoxItemDelegate(QObject *parent = 0); | |||
~ComboBoxItemDelegate(); | |||
virtual QWidget *createEditor( QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index ) const; | 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 | #endif // ITEMDELEGATE_H | ||
</code> | |||
File itemdelegate.cpp | File itemdelegate.cpp | ||
<code> | <code> | ||
// —— File itemdelegate.cpp —— | |||
#include "itemdelegate.h" | |||
#include <QComboBox> | |||
ComboBoxItemDelegate::ComboBoxItemDelegate(QObject '''parent) | ComboBoxItemDelegate::ComboBoxItemDelegate(QObject '''parent) | ||
: QStyledItemDelegate(parent) | |||
{ | |||
} | |||
ComboBoxItemDelegate::~ComboBoxItemDelegate() | |||
{ | |||
} | |||
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); | |||
void ComboBoxItemDelegate::setModelData ( QWidget *editor, QAbstractItemModel *model, 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 | |||
{ | |||
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 &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> | <code> | ||
// —— File main.cpp —— | |||
#include <QApplication> | |||
#include <QTableWidget> | |||
#include | #include "itemdelegate.h" | ||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||
{ | |||
QApplication a(argc, argv); | |||
QTableWidget tw; | |||
ComboBoxItemDelegate *cbid = new ComboBoxItemDelegate(&tw); | ComboBoxItemDelegate *cbid = new ComboBoxItemDelegate(&tw); | ||
tw.setItemDelegate(cbid); | |||
tw.setColumnCount(4); | |||
tw.setRowCount(10); | |||
tw.resize(600,400); | |||
tw.show(); | |||
return a.exec | 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 &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
// —— 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
{
// 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 &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 &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 ——
- include <QApplication>
- include <QTableWidget>
- 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();
}