自定义代理编辑控件类TSpinBoxBoxDelegate
自定义代理编辑控件类TSpinBoxBoxDelegate的定义过程
重写自定义代理编辑组件类的四个方法: 创建编辑组件、模型赋值给代理编辑组件、代理编辑组件数据到模型、更新位置
.h
#ifndef TSPINBOXDELEGATE_H
#define TSPINBOXDELEGATE_H
#include <QObject>
#include <QStyledItemDelegate>
class TSpinBoxDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit TSpinBoxDelegate(QObject *parent = nullptr);
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 // TSPINBOXDELEGATE_H
.cpp
#include "tspinboxdelegate.h"
#include <QSpinBox>
TSpinBoxDelegate::TSpinBoxDelegate(QObject *parent)
: QStyledItemDelegate{parent}
{
}
QWidget *TSpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(option);
Q_UNUSED(index);
QSpinBox *spinBox = new QSpinBox(parent);
spinBox->setFrame(false);
spinBox->setMinimum(0);
spinBox->setMaximum(50000);
return spinBox;
}
void TSpinBoxDelegate::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 TSpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
spinBox->interpretText(); //解释数据,如果数据被修改后,就触发信号
int value = spinBox->value();
model->setData(index,value,Qt::EditRole);
}
void TSpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
Q_UNUSED(index);
editor->setGeometry(option.rect);
}
TSpinBoxBoxDelegate自定义编辑控件总结
1. 统一继承自 QStyledItemDelegate
2. 根据TSpinBoxBox的特性,赋值 为int类型
3. 将QWidget 转换为 TSpinBoxBox ,使用static_cast