96SEO 2026-02-20 00:17 21
传统的模型-视图框架可以让我们实现逻辑展示相分离我们只需要关心模型就可以在模型上做的任何更改都会走动更新到视图上去其实就是观察者模式。

Qt基于传统的模型-视图框架MVCmodel、view、controler推出了MVD(model、view、delegate)框架。
具体有什么用呢
如果我们使用QTableView来作为表格控件显示数据但是突然有需求需要在里面添加一些交互的控件例如按钮、进度条之类的直接使用模型是无法实现的。
可以使用QTableWidget控件可以很轻松的实现但是这个不支持模型-视图框架。
代理的作用就来了代理可以把控件委托给模型来代理就可以实现在表格中添加控件进行交互了。
QAbstractItemDelegate是所有代理类的抽象基类QStyledItemDelegate是视图组件使用的缺省的代理类QItemDelegate也是类似功能的类。
QStyledItemDelegate与QItemDelegate的差别在于QstyledltemDelegate可以使用当前的样式表设置来绘制组件因此建议使用QStyledItemDelegate作为自定义代理组件的基类。
不管从QStyledItemDelegate还是QItemDelegate继承设计自定义代理组件都必须实现如下
createEditor()函数创建用于编辑模型数据的widget组件如一个QSpinBox组件或一个
setEditorData()函数从数据模型获取数据供widget组件进行编辑
setModelData()将widget上的数据更新到数据模型
updateEditorGeometry()用于给widget组件设置一个合适的大小。
在实例samp5_3中导入数据文件进行编辑时QTableView组件为每个单元格提供的
是缺省的代理编辑组件就是一个QLineEdit组件。
在编辑框里可以输入任何数据所以比较通用。
但是有些情况下希望根据数据的类型限定使用不同的编辑组件例如在samp5_3的实例的数据中
第1列“测深”是整数使用QSpinBox作为编辑组件更合适“垂深”“方位”“总位移”是浮点数
下面设计一个基于QSpinBox类的自定义代理类用于“测深”数据列的编辑。
定义一个自定义类的名称为QWIntSpinDelegate设置基类为QStyledItemDelegate添加到项目里。
在头文件qwintspindelegate.h中包含对自定义类QWIntSpinDelegate的定义在其中添加4个需要重定义的函数的定义qwintspindelegate.h的内容如下
public:QWIntSpinDelegate(QObject
createEditor()函数用于创建需要的编辑组件QWIntSpinDelegate类希望创建一个QSpinBox作为编辑组件函数的实现如下
*QWIntSpinDelegate::createEditor(QWidget
//创建一个QSpinBoxeditor-setFrame(false);
//设置为无边框editor-setMinimum(0);editor-setMaximum(10000);return
这段代码创建了一个QSpinBox类型的编辑器editorparent指向视图组件然后对创建的editor做一些设置将editor作为函数的返回值。
setEditorData()函数用于从数据模型获取数值设置为编辑器的显示值。
当双击一个单元格进入编辑状态时就会自动调用此函数其实现代码如下
QWIntSpinDelegate::setEditorData(QWidget
//强制类型转换spinBox-setValue(value);
函数传递来的参数editor指向代理编辑组件index是关联的数据单元的模型索引。
通过强制类型转换将editor转换为QSpinBox类型组件spinBox然后将获取的数值设置为spinBox的值。
setModelData()函数用于将代理编辑器上的值更新给数据模型当用户在界面上完成编辑时会自动调用此函数将界面上的数据更新到数据模型。
其代码如下
QWIntSpinDelegate::setModelData(QWidget
//强制类型转换spinBox-interpretText();
//获取spinBox的值model-setData(index,
程序先获取代理组件编辑器里的数值然后利用传递来的数据模型model和模型索引参数index将编辑器的最新值更新到数据模型里。
updateEditorGeometry()函数用于为代理组件设置一个合适的大小函数传递的参数option的rect变量定义了单元格适合显示代理组件的大小直接设置为此值即可。
代码如下。
QWIntSpinDelegate::updateEditorGeometry(QWidget
//设置组件大小editor-setGeometry(option.rect);
同样的可以创建基于QDoubleSpinBox的自定义代理组件类QWFloatSpinDelegate用于编
辑浮点数还可以创建基于QComboBox的自定义组件类QWComboBoxDelegate。
在主窗口的类
在MainWindow的构造函数中为tableView的某些列设置自定义代理组件。
增加了自定义代理组件的构造函数代码如下去掉了初始化状态栏等一些不重要的内容
QStandardItemModel(2,FixedColumnCount,this);
QItemSelectionModel(***Model);//Item选择模型connect(***Selection,SIGNAL(currentChanged(QModelIndex,QModelIndex)),this,SLOT(on_currentChanged(QModelIndex,QModelIndex)));//为tableView设置数据模型ui-tableView-setModel(***Model);
//设置数据模型ui-tableView-setSelectionModel(***Selection);//设置选择模型//为各列设置自定义代理组件ui-tableView-setItemDelegateForColumn(0,intSpinDelegate);
//测深整数ui-tableView-setItemDelegateForColumn(1,floatSpinDelegate);
//浮点数ui-tableView-setItemDelegateForColumn(2,floatSpinDelegate);
//浮点数ui-tableView-setItemDelegateForColumn(3,floatSpinDelegate);
//浮点数ui-tableView-setItemDelegateForColumn(4,comboBoxDelegate);
为TableView的某一列设置自定义代理组件使用setltemDelegateForColumn()函数为某一行设置自定义代理组件可使用setltemDelegateForRow()函数若为整个TableView设置一个自定义代理组件则调用setltemDelegate()函数。
如此增加了自定义代理功能后在编辑“测深”列时会在单元格的位置出现一个SpinBox组件用于输入整数在编辑第2至4列的浮点数时会出现一个DoubleSpinBox组件用于输入浮点数而在编辑“固井质量”列时会自动出现一个ComboBox组件用于从下拉列表中选择一个字符串。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback