1.在做项目中遇到,QTableView要求可编辑到小数点后七位,使用自定义委托,重写QStyledItemDelegate类下面的
// editing
QWidget *createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
void setEditorData(QWidget *editor, const QModelIndex &index) const Q_DECL_OVERRIDE;
void setModelData(QWidget *editor,
QAbstractItemModel *model,
const QModelIndex &index) const Q_DECL_OVERRIDE;
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option,
const QModelIndex &index) const Q_DECL_OVERRIDE;
2.写个小demo
.h头文件
//小数点后七位,利用QSpinBox委托进行输入限制
class DoubleSpinBoxDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
DoubleSpinBoxDelegate(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;
};
.cpp文件
DoubleSpinBoxDelegate::DoubleSpinBoxDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
}
QWidget* DoubleSpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (QVariant::Double == index.model()->data(index, Qt::EditRole).type())
{
QDoubleSpinBox *pEditor = new QDoubleSpinBox(parent);
pEditor->setFrame(false);
pEditor->setMinimum(-180.0000000);
pEditor->setMaximum(180.0000000);
pEditor->setDecimals(7);
return pEditor;
}
else
{
return QStyledItemDelegate::createEditor(parent, option, index);
}
}
void DoubleSpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
if (QVariant::Double == index.model()->data(index, Qt::EditRole).type())
{
double value = index.model()->data(index, Qt::EditRole).toDouble();
QDoubleSpinBox *pSpinBox = static_cast<QDoubleSpinBox*>(editor);
pSpinBox->setValue(value);
}
else
{
QStyledItemDelegate::setEditorData(editor, index);
}
}
void DoubleSpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
if (QVariant::Double == index.model()->data(index, Qt::EditRole).type())
{
QDoubleSpinBox *pSpinBox = static_cast<QDoubleSpinBox*>(editor);
pSpinBox->interpretText();
double value = pSpinBox->value();
model->setData(index, value, Qt::EditRole);
}
else
{
QStyledItemDelegate::setModelData(editor, model,index);
}
}
void DoubleSpinBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
使用方式
ui.tableView->setItemDelegateForColumn(1, new DoubleSpinBoxDelegate(this));//第一列使用代理