百度推广帮做网站,网站tkd怎么做,自己学习做网站6,网上做任务挣钱的网站一、为什么需要委托 模型#xff08;model#xff09;用来数据存储#xff0c;视图#xff08;view#xff09;用来展示数据。因此#xff0c;模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示#xff1a; 由图可知#xff0c;模型向视图提供数…一、为什么需要委托 模型model用来数据存储视图view用来展示数据。因此模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示 由图可知模型向视图提供数据是单向的一般仅用于显示数据。当我们需要在视图上编辑数据时就需要用到委托delegate来提供一个临时的编辑器。这个编辑器既能获取模型的数据又能在接受用户编辑的数据后提交给模型。 注delegate有的书上直接翻译为代理。个人认为这个翻译不太准确因为在Qt中代理Proxy和委托Delegate是两个不同的概念。Proxy用于数据模型和视图之间的一些中介操作包括对数据进行过滤、排序和转换。而Delegate则用于自定义视图项的显示和编辑行为主要用于定制单元格的外观和编辑控件。 二、自定义委托
1.为什么自定义委托 如果我们没有提前进行任何设置在默认情况下委托提供的临时编辑器是QLineEdit编辑框。而我们知道QLineEdit不仅可以输入文字还能输入数组字母符号等任何数据。但是更多情况下我们希望根据数据类型使用不同的编辑器。 2.如何自定义委托 QStyledItemDelegate是视图组件使用的默认委托类。因此在创建好自定义委托类后必须首先将自定义的委托类实现QStyledItemDelegate中定义的4个虚函数右键选择重构可自动生成。而这4个虚函数是模型/视图系统自动调用的。 1creareEditor() 这个函数用来创建编辑模型数据的界面组件称为代理编辑器。函数定义如下
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem option, const QModelIndex index) const;
parent创建组件的父组件一般就是窗口对象。option一些显示选项包含字体、对齐方式、背景色等。index模型索引用来获取模型数据。 函数实现如下
QWidget *TSpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem option, const QModelIndex index) const
{QSpinBox *editor new QSpinBox(parent); editor-setFrame(false); editor-setMinimum(0);editor-setMaximum(50000);return editor;
}
注这里并没有返回QWidget类型而是返回了它的派生类QSpinBox类型。因此后面要注意类型转换。
2setEditorData() 这个函数会从数据模型获取数据然后显示到代理组件中。函数定义如下
void setEditorData(QWidget *editor, const QModelIndex index) const;
editor前面函数 creareEditor() 返回的代理编辑器index用 index.model() 可以从数据模型获取数据 函数实现如下
void TSpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex index) const
{int value index.model()-data(index, Qt::EditRole).toInt(); QSpinBox *spinBox static_castQSpinBox*(editor); // 类型转换spinBox-setValue(value);
}
3setModelData() 这个函数会将代理组件的数据保存到数据模型中。函数定义如下
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex index) const; model需要保存数据的数据模型 函数实现如下
void TSpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex index) const
{QSpinBox *spinBox static_castQSpinBox*(editor); //强制类型转换int value spinBox-value(); //获取spinBox的值model-setData(index, value, Qt::EditRole); //更新到数据模型
}
4 updateEditorGeometry() 这个函数用来更新代理编辑组件的大小一般写法比较固定。函数实现如下
void TFloatSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem option, const QModelIndex index) const
{editor-setGeometry(option.rect); // 设置代理编辑器大小为建议大小
} 写到这里委托类就设置完了。接下来我们还需要在mainwindow.cpp中的构造函数初始化列表添加如下代码完成对相关组件的委托。
TSpinBoxDelegate intSpinDelegate new TSpinBoxDelegate(this);
ui-tableView-setItemDelegateForColumn(0, intSpinDelegate); 这时当我们修改某项数据时就会自动产生一个QSpinBox的组件编辑器而不是默认的QLineEdit。