代理Delegate的小应用(代理日期控件和下拉框)

前言

  • 在平时关于表格一类的的控件使用中,不可避免需要修改每个Item的值,通过在Item中嵌入不同的控件对编辑的内容进行限定,然而在表格的Item中插入的控件始终显示,当表格中item项很多的时候,会影响表格的美观和用户的体验。此时Delegate代理就派上了用场,通过Delegate可以使得Item的控件在编辑状态才显示,提高了用户的体验满意度。

效果展示

1、展示状态:

2、编辑状态

 

设计思路

  • 这类效果的实现主要使用了QItemDelegate类,QItemDelegate类为数据项Item的显示和编辑提供了一套工具。
  • QItemDelegate类可以用来Item项的常规性展示,也可以为基于QAbstractItemView 的控件的Item提供编辑的功能。QItemDelegate是Model/View的框架的一部分。
  • 可以通过实现以下四个函数来为Item实现基本的编辑功能。
QWidget *createEditor(QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index) const;//返回改变Model数据的widget,该widget是经过定制行为的Widget

void setEditorData(QWidget * editor, const QModelIndex & index) const;//将可操作的数据提供给widget

void setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const;  //将widget的数据展示到Item中

void updateEditorGeometry(QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index) const;//确保widget能够正确显示到view中
  • 从介绍的四个虚函数可以看出,通过实现这四个函数,可以基本实现表格类控件的ITem的编辑功能,以下将以日历控件来对这些函数的实现做一个介绍,其他的控件甚至是自定义控件,通过照猫画虎,相信可以达到自己的目的。
QWidget *DateDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QDateTimeEdit *editer = new QDateTimeEdit(parent);
    editer->setDisplayFormat("yyyy-MM-dd");//设置显示格式
    editer->setCalendarPopup(true);//设置日历控件为悬空显示
    editer->installEventFilter(const_cast<DateDelegate*>(this));//安装时间过滤器,使得代理能够获取定制控件的值
    return editer;
}
void DateDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    QString dateStr = index.model()->data(index).toString();//通过index获取model中相应项ITem的值
    QDate date = QDate::fromString(dateStr,Qt::ISODate);
    QDateTimeEdit *edit = static_cast<QDateTimeEdit *>(editor);//转换类型获取定制的控件
    edit->setDate(date);//将Item项中的值展示到定制控件中
}
void DateDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    QDateTimeEdit *edit = static_cast<QDateTimeEdit *>(editor);
    QDate date = edit->date();
    model->setData(index,QVariant(date.toString(Qt::ISODate)));//将定制控件中的值展示到表格中
}
//调整定制控件的展示,确保可以展示到窗体View中
void DateDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);
}

总结

  • 好了,通过以上的介绍,通过自定义类实现QItemDelegate类,可以使用定制的控件实现表格类控件的展示和编辑功能无缝切换,提高用户体验。
  • 该链接是本人试验的简单的代码,欢迎各位交流技术,互相提高!

http://download.csdn.net/detail/sxpsxp12/9619317

http://blog.csdn.net/sxpsxp12/article/details/52402496

时间: 2024-10-12 01:43:20

代理Delegate的小应用(代理日期控件和下拉框)的相关文章

Dev控件的下拉框控件设置默认选中项

DevExpress中下拉框控件comboBoxEdit,用法和winform的不太一样,在绑完选项后,希望设置默认选中项. 有2种方法: 方法1this.cmbMacScan.EditValue = new CheckedListBoxItem { Value = model.ScanInterval, Description = model.ScanInterval.ToString() }; this.cmbMacScan.RefreshEditValue(); 方法2this.cmbMa

几种常用的控件(下拉框 可选框 起止日期)

下拉框 <div class="form-group">                        <label class="col-xs-3 control-label no-padding-right">状态</label>                        <div class="col-xs-9">                         <select  c

Qt qml中listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

Qt qml中listview 列表视图控件(下拉刷新.上拉分页.滚动轴) 来源 https://www.cnblogs.com/surfsky/p/4352898.html 设置ListView涉及到将contentsY,即视图的可见部分的顶部,设置y为委托的值.另一个更改是interactive将视图设置为false.这样可以防止视图移动.用户不能再滚动列表或更改当前Item. contentY为列表上拉后列表左上角点距显示框左上解点的高度listView1.height为可显示部分的高度,

DroDownList控件多级下拉菜单

后台代码: /// <summary> /// 绑定下拉菜单 /// </summary> private void BindDropList() { DataTable dt = bacManage.GetAllArticleCategory(); CreateLevelDropDown(drpCategoryId, dt); } /// <summary> /// 创建分级下拉框 /// </summary> /// <param name=&qu

支持各种控件上/下拉刷新的android-pulltorefresh

android- pulltorefresh 一个强大的拉动刷新开源项目,支持各种控件下拉刷新,如ListView.ViewPager.WevView. ExpandableListView.GridView.(Horizontal) ScrollView.Fragment上下左右拉动刷新.并且他 实现的下拉刷新ListView在item不足一屏情况下也不会显示刷新提示,体验很好. 特性 直接上拉.下拉刷新,也可以从底层直接回到顶部. 滑动动画通配所有的设备. 支持Android 2.3 版本之

介绍Web项目中用到的几款js日历日期控件和js文本编辑框插件

第一款日历日期控件:layDate 官方网站:http://laydate.layui.com/ 第二款日历日期控件:my97 官方网站:http://www.my97.net/ 第三款 文本编辑器控件:CKEditor 官方网站:http://ckeditor.com/ 第四款 文本编辑器控件:KindEditor 官方网址:http://kindeditor.net/demo.php 第五款 文本编辑器控件:UEditor 官方网址:http://ueditor.baidu.com/webs

MFC的组合框(ComboBox)控件切换下拉样式

由于课题的需求需要做MFC串口程序,看了百度下载的串口助手的界面风格,发现这个设计很好 波特率的组合框只给出了5个可选数值,然后第6个选项是Custom,即手动输入. 实际上DCB结构的BaudRate可选数值太多了,做成下拉框会很长很长,这种做法就是选用最常见的几个选项,不需要用户手动输入,也不需要在很长的列表中去选择. 从VS的属性框中可以看到,组合框控件有3种样式,也就是实现的功能是点击Custom选项时从Drop List切换到Dropdown. 从MSDN可以看到两者对应的宏分别为CB

Excel日历控件实现下拉选取日期含VB代码实现

以下是Excel2016通过安装控件,实现表格下拉选择日期的一些步骤: 知识准备工作:先了解下如何安装控件,这一部分很重要,excel选择可用宏https://jingyan.baidu.com/article/6181c3e0ad4144152ef1533f.html 如果没有日历控件:Microsoft Date and Time Picker Control(SP6) 先下载MSCOMCT2 链接:https://pan.baidu.com/s/1CGV1MBJyBjlqTd7_QFXHq

js控件,下拉菜单

要求输入框点击出现下拉菜单,并实现以下功能: 1.首先点击地点标签页,选择好地点: 2.自动显示相应节点标签页显示节点信息,选择好节点 3.自动显示相应的连接点,选择连接点,连接点被选中并被传送的输入框input控件中 制作了该控件的jquery插件,格式采用bootstrap的. 调用方法: input控件写成 <input class="form-control dropdown-toggle" data-toggle="dropdown" id=&quo