各种视图组件皆源自QAbstractItemView类,该类为其中显示的每个数据项皆提供一个默认代理——单行文本编辑框(QLineEdit)组件。在编辑框中可以输入任何类型的数据,比较通用。但是某些情况下,可能希望针对特定的数据类型使用相应的编辑控件。比如,针对表格中表示的“性别”数据列,使用组合框显然比使用编辑框更为合理。
为此,可以从QStyledItemDetegate类派生出自己的子类,并覆盖其中的若干虚函数:
xxxxxxxxxx
81virtual QWidget* QStyledItemDelegate::createEditor(
2 QWidget* parent, QStyleOptionViewItem const& option, QModelIndex const& index) const; // 创建编辑器
3virtual void QStyledItemDelegate::setEditorData(
4 QWidget* editor, QModelIndex const& index) const; // 从模型获得数据,设置给编辑器
5virtual void QStyledItemDelegate::setModelData(
6 QWidget* editor, QAbstractItemModel* model, QModelIndex const& index) const; // 从编辑器获得数据,设置给模型
7virtual void QStyledItemDelegate::updateEditorGeometry(
8 QWidget* editor, QStyleOptionViewItem const& option, QModelIndex const& index) const; // 设置编辑器的大小
然后,将该自定义代理类的实例化对象交给视图:
xxxxxxxxxx
21void QAbstractItemView::setItemDelegateForRow(int row, QAbstractItemDelegate* delegate); // 为行设置代理
2void QAbstractItemView::setItemDelegateForColumn(int column, QAbstractItemDelegate* delegate); // 为列设置代理