createEditor
setEditorData
setModelData
这三个函数是要用到的函数。然而按F1居然不能跳转到帮助文档,这算不算bug。
下面这段代码是要实现在一个表格中添加spin控件
spinDelegate头文件:
#ifndef SPINBOXDELEGATE_H#define SPINBOXDELEGATE_H
#include <QItemDelegate>
#include <QObject>
#include <QSpinBox>
class SpinBoxDelegate : public QItemDelegate
{
Q_OBJECT
public:
SpinBoxDelegate(QObject *parent = 0);
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#endif // SPINBOXDELEGATE_H
cpp文件
#include "spinboxdelegate.h"#include <QSpinBox>
#include <QItemDelegate>
SpinBoxDelegate::SpinBoxDelegate(QObject *parent)
: QItemDelegate(parent)
{
}
QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{
QSpinBox *editor = new QSpinBox(parent);
editor->setRange(0,10000);
editor->installEventFilter(const_cast<SpinBoxDelegate*>(this));
return editor;
}
void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
int value = index.model()->data(index, Qt::EditRole).toInt();
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->setValue(value);
}
void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QSpinBox *box = static_cast<QSpinBox*>(editor);
int value = box->value();
model->setData(index,value);
}
void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect); // option.rect属性中保存了条目的位置,这里将控件设置在刚好占住条目的位置
}
当然,别忘记了在窗口做一些设置
#include "widget.h"#include <QItemDelegate>
#include <QDir>
#include <QFileInfo>
#include <QFile>
#include <QFileDialog>
#include "spinboxdelegate.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QStandardItemModel *tableModel=new QStandardItemModel(4,4,this);
SpinBoxDelegate *spinDelegate=new SpinBoxDelegate;
tableModel->setHeaderData(0,Qt::Horizontal,tr("部门"));
tableModel->setHeaderData(1,Qt::Horizontal,"姓名");
tableModel->setHeaderData(2,Qt::Horizontal,"女");
tableModel->setHeaderData(4,Qt::Horizontal,"退休");
QTableView *tabletView=new QTableView;
tabletView->setModel(tableModel);
tabletView->setItemDelegateForColumn(3,spinDelegate);
QHBoxLayout *mainLayout=new QHBoxLayout(this);
mainLayout->addWidget(tabletView);
}