给QT表格Tableview加控件 、绘图

韩善
2023-12-01

一、利用委托给表格加控件,通过改变编辑器的达到加控件的效果

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)));


       }

 

 类似资料: