主要是对数据视图、模型,以及代理之间的关系做了一些笔记。
QListView、QTableView等等,可以用来以列表的形式展示数据,在Qt中使用model/View结构来管理数据与视图的关系,QStandardItemModel-model负责数据的存取,数据的交互通过delegate来实现(模型的交互和绘制通过自定义delegate来实现)。
1、Qt需要的模块:
(1)展示数据:QListView(作为例子展示)
(2)数据的存取:QStandardItemModel
(3)模型的交互和绘制:自定义delegate来实现(继承于QStyledItemDelegate)
2、模块之间关系:(图片展示)
3、使用方法:
(1)声明数据:
TagListView *m_tagListView = Q_NULLPTR;//TagListView,可以直接用QListView ItemDelegate *m_delegate= Q_NULLPTR;//一般是派生于QStyledItemDelegate,重写paint( )函数 QStandardItemModel *m_model= Q_NULLPTR;//数据的存取 |
(2)使用——初始化
m_tagListView->setItemDelegate(m_delegate);//为视图设置委托,呈现的效果,重写paint( ) m_tagListView->setSpacing(15); m_tagListView->setModel(m_model);//为委托设置模型 m_tagListView->setViewMode(QListView::IconMode);//设置Item图标显示 m_tagListView->setDragEnabled(false);//控件不允许拖动 ListItemDatalistItem;//自己定义的数据结构体,就是自己想存放什么数据 listItem.name=QString::number(idx); listItem.tel=listItem.name+listItem.name; QStandardItem *item=newQStandardItem(); item->setData(QVariant::fromValue(listItem));//转化为标准的数据类型 m_model->appendRow(item);//加入到模型中 view中的编辑功能默认实现下是在该单元格处于编辑状态时才会实例化编辑组件,相关接口如下: QWidget*createEditor()const override;//可以重新创建条目编辑的方式 voidsetEditorData()const override;//将目前的值赋给对应的控件当前值 voidsetModelData()const override;//修改后的数据重新赋值给model,更新列表的值 voidupdateEditorGeometry()const override;//更新编辑框的位置,否则默认为左上角 |
(3)要是想实现不同的列进行不同的初始化,一般会重载以下的参数(QTableView)
view 中的编辑功能默认实现下是在该单元格处于编辑状态时才会实例化编辑组件,相关接口如下:
QWidget*createEditor()const override;//可以重新创建条目编辑的方式 voidsetEditorData()const override;//将目前的值赋给对应的控件当前值 voidsetModelData()const override;//修改后的数据重新赋值给model,更新列表的值 voidupdateEditorGeometry()const override;//更新编辑框的位置,否则默认为左上角 |
4、使用交互:
1、先填充数据ModelMarkRecordItem; ModelMarkRecordItem* item =newModelMarkRecordItem(); item->setData(ModelMarkRecordModel::RoleId, (*iter)->id()); 2、插入模型结构里 m_model->insertRow(0, item); 3、通过光标获得模型数据: //获得控件内的坐标 QPoint pos =mapFromGlobal(globalPos);//或者:QCursor::pos() ModelMarkRecordItem*item=itemByIndex(indexAt(pos)); QStringrecordId=recordIdByItem(item); (1)indexAt(QPoint pos)// QListView获得QModelIndex & (2)//自己定义,转为自己想要的数据类型 itemByIndex(constQModelIndex & index); if(index.isValid()) { ModelMarkRecordItem* item =reinterpret_cast<ModelMarkRecordItem*>(index.internalPointer());//获得内部指针 returnitem; } |