Combo Boxes in Item Views: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Convert ExpressionEngine links)
(Decode HTML entity names)
Line 28: Line 28:
  ~ComboBoxItemDelegate();
  ~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 setEditorData ( QWidget *editor, const QModelIndex &index ) const;
  virtual void setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const;
  virtual void setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const;


};
};
Line 55: Line 55:




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
  // ComboBox ony in column 2
Line 70: Line 70:
}
}


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)) {
  if(QComboBox '''cb = qobject_cast<QComboBox'''>(editor)) {
Line 84: Line 84:
}
}


void ComboBoxItemDelegate::setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &amp;index ) const
void ComboBoxItemDelegate::setModelData ( QWidget *editor, QAbstractItemModel *model, const QModelIndex &index ) const
{
{
  if(QComboBox '''cb = qobject_cast<QComboBox'''>(editor))
  if(QComboBox '''cb = qobject_cast<QComboBox'''>(editor))
Line 108: Line 108:
  QTableWidget tw;
  QTableWidget tw;


ComboBoxItemDelegate *cbid = new ComboBoxItemDelegate(&amp;tw);
ComboBoxItemDelegate *cbid = new ComboBoxItemDelegate(&tw);
  tw.setItemDelegate(cbid);
  tw.setItemDelegate(cbid);
  tw.setColumnCount(4);
  tw.setColumnCount(4);

Revision as of 17:00, 12 March 2015

This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine.
Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean.

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 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 ——

  1. include <QApplication>
  2. include <QTableWidget>
  1. 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(); }