一、利用委托给表格加控件,通过改变编辑器的达到加控件的效果
1、直接改变编辑器 双击之后就会显示滑条并可以修改
此例子以QSlider为例,其余控件也一样
class SliderDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
SliderDelegate(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;
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
首先创建编辑器
//创建编辑器 CreateEditor()函数在用户开始编辑项时调用
QWidget *SliderDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
{
QSlider* editor = new QSlider(parent);
editor->setMaximum(5);
editor->setMinimum(0);
editor->setOrientation(Qt::Horizontal);//水平
editor->setSingleStep(1); // 步长
editor->setTickInterval(1);
editor->setTickPosition(QSlider::TicksBothSides); //两边都有刻度
return editor;//返回一个QSlider的编译器
}
创建控件对象时 new的时候要指定父亲,否则需要delete释放
比如 QButton *button= new QButton();需要手动释放
//将数据写入到编辑器 在创建编辑器以使用来自模型的数据初始化它时调用 提供编辑的原始数据
void SliderDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
QSlider *slider =static_cast<QSlider*>(editor);
int data = index.model()->data(index,Qt::EditRole).toInt();
slider->setValue(data);
}
//将数据写入到模型 编辑完成后调用,以便将数据从编辑器提交到模型
void SliderDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
QSlider *slider =static_cast<QSlider*>(editor);
QVariant itemData = slider->value();
//获取当前slider绑定的数据
model->setData(index, itemData, Qt::EditRole);
}
//更新编辑器布局
void SliderDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
editor->setGeometry(option.rect);
}
2、也可以重写paint函数,直接画想要加入的,比如添加图片什么的,适合静态的,此处不再举例
二、直接加控件
不用双击单元格就可以直接显示在表格中,比较适合静态显示,如果控件要触发相应的事件,我这里是用connect解决
由于滑条自动响应滚轮事件,不点击滑条也可以通过滚轮移动,信息可能会混乱,所以我重写了滑条控件的鼠标滚轮事件函数
for(int i = 0; i <model->rowCount(); i++)
{
MySlider *sliders = new MySlider(this);
sliders->setOrientation(Qt::Horizontal); // 水平方向
sliders->setMinimum(0); // 最小值
sliders->setMaximum(5); // 最大值
sliders->setSingleStep(1); // 步长
sliders->setTickInterval(1); // 设置刻度间隔
sliders->setTickPosition(QSlider::TicksAbove); //刻度在上方
int data = model->record(i).value("name").toInt();
sliders->setValue(data);
ui->tableView->setIndexWidget(model->index(i,5), sliders);
connect(sliders, SIGNAL(valueChanged(int)),this, SLOT(sValue(int)));
}