目录
Qt的数据容器控件采用模型/视图(model/view)架构设计。模型用于存放控件的数据,视图则用于显示编辑数据,而委托则是用于实现自定义视图的一种方式。比如我们在QTableWidget表格控件中想要使用combox控件来编辑数据,就需要使用到委托功能。对于委托,通俗一点理解就是将需要实现的一些功能交由其他对象来承担。本文以QTableWidget控件为例,对Qt中委托的使用进行简要介绍。
一、子类化委托
QT中常用的委托类有两个,分别是QItemDelegate和QStyledItemDelegate,官方建议优先使用QStyledItemDelegate。官方解释是它们之间的区别在于QStyledItemDelegate使用当前样式来绘制其项目。因此,建议在实现自定义委托或使用Qt样式表时使用QStyledItemDelegate作为基类,除非自定义委托需要使用绘图样式。一般情况下,我们就直接使用QStyledItemDelegate类。类的继承实现头文件如下。默认情况下,至少需要重写createEditor、setEditorData、setModelData、updateEditorGeometry这4个函数。
类的头文件中定义了一个私有成员names,用于存放传递给QCombox控件的项目参数,并同时定义了一个公有函数,用于设置names的值。在规范的类定义中,一般不将类的成员变量或属性值设置为公有的,为了体现类的封装性,对类成员的赋值和取值都使用方法来实现。同时在最后还定义了一个信号haveSetSignal,用于返回需要往外传递的参数。
#ifndef CUSTOMSTYLEDITEMDELEGATE_H
#define CUSTOMSTYLEDITEMDELEGATE_H
#include <QObject>
#include <QStyledItemDelegate>
#include <QComboBox>
#include <QCheckBox>
#include <QApplication>
class CustomStyledItemDelegate:public QStyledItemDelegate
{
Q_OBJECT
private:
QStringList names;
public:
void setNames(QStringList);
explicit CustomStyledItemDelegate(QObject *parent = nullptr);
QWidget * createEditor( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const override;
void setEditorData( QWidget * editor, const QModelIndex & index