这几天我又接触了一个新东西——代理(Delegate),记录一下学习过程吧,以后万一用到了呢哈哈哈哈,平常我们在QTableWidget里面添加控件的时候一般都是使用的下面这种方式,比如我搞一个QComboBox到表格里面去。
QComboBox *cb = new QComboBox;
cb->addItem("1111");
cb->addItem("222");
cb->addItem("333");
ui->tableWidget->setCellWidget(0,4,cb);
效果就是这样滴,就是在第一行第五列有一个下拉框,,,这样呢就有一个坏处,这种在表格中插入控件的方式,这个控件是一直显示的,当表格数据比较多的时候,比较影响表格美观了吧。你们觉得呢?
此时我们就可以利用自定义Delegate的方式实现同样的效果,只在你需要编辑的时候才会显示,然后就解决了,完美~。
- 定义一个类继承于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;
- 具体的实现代码如下
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); }
- 使用方式
myComboDelegate *ComDelegate = new myComboDelegate; ui->tableWidget->setItemDelegateForColumn(4,ComDelegate); //设置表格的第四列为自定义代理
- 效果如下,可以看到表格是没有控件的,但是选中双击之后,控件就出来咯。