QTableWidget添加控件(自定义代理)

        这几天我又接触了一个新东西——代理(Delegate),记录一下学习过程吧,以后万一用到了呢哈哈哈哈,平常我们在QTableWidget里面添加控件的时候一般都是使用的下面这种方式,比如我搞一个QComboBox到表格里面去。

QComboBox *cb = new QComboBox;
cb->addItem("1111");
cb->addItem("222");
cb->addItem("333");
ui->tableWidget->setCellWidget(0,4,cb);

        效果就是这样滴,就是在第一行第五列有一个下拉框,,,这样呢就有一个坏处,这种在表格中插入控件的方式,这个控件是一直显示的,当表格数据比较多的时候,比较影响表格美观了吧。你们觉得呢?

         此时我们就可以利用自定义Delegate的方式实现同样的效果,只在你需要编辑的时候才会显示,然后就解决了,完美~。

  1. 定义一个类继承于QItemDelegate,然后重写以下几个函数。
    //主要完成创建控件
    virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 
    
    // 设置控件显示的数据
    virtual void  setEditorData(QWidget *editor, const QModelIndex &index) const override;
    
     //对数据的改变更新到Model中
    virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override;
    
    //完成控件的大小
    virtual void  updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override; 
    
  2.  具体的实现代码如下
    QWidget *myComboDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        Q_UNUSED(option);
        Q_UNUSED(index);
        QComboBox *editor = new QComboBox(parent);
        QStringList list;
        list<<"111";
        list<<"222";
        list<<"333";
        list<<"444";
        list<<"555";
        editor->addItems(list);
        
        return editor;
    }
    
    void myComboDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        QString str = index.model()->data(index).toString();
        QComboBox *box = static_cast<QComboBox*>(editor);
        int i =  box->findText(str);
        box->setCurrentIndex(i);
    }
    
    void myComboDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        QComboBox *box = static_cast<QComboBox*>(editor);
        QString str = box->currentText();
        model->setData(index,str);
    }
    
    void myComboDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        Q_UNUSED(index);
        editor->setGeometry(option.rect);
    }
  3. 使用方式
    myComboDelegate *ComDelegate = new myComboDelegate;
    ui->tableWidget->setItemDelegateForColumn(4,ComDelegate); //设置表格的第四列为自定义代理
  4. 效果如下,可以看到表格是没有控件的,但是选中双击之后,控件就出来咯。

 

  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值