qt的model接口(qabstractItemModel)管理的数据抽象来说是节点树,最顶层的根节点可以有N行M列个子item,而每个item又可以有自己的N行M列个子item。
qt的view接口(qabstractItemView)的实现是从model获取数据,但要怎样在窗口中渲染这些数据,每个view的实例都可以有自己的实现,甚至可以忽略model中的部分item,仅渲染一部分感兴趣的item,渲染的图形可以是表状的,可以是圆饼型的,任何类型的渲染方式都可以,甚至什么都不渲染都行。
这完全取决于view在其paintEvent函数中的实现。paintEvent函数主要做两件事情,一,从model中读时间,二,渲染任意想要的图形。渲染即可以交给view对应的item delegate来实现,也可以view自己在paintEvent函数中直接渲染而不委托给delegate对象。
item delegate对象会实现paint函数,paint函数一次渲染一个item,所以在view的paintEvent函数中可以针对每个要渲染的item调用一次paint函数,paint函数的参数中指定了要渲染哪个item,然后是这个item要渲染的位置(用rect表示)。每个view有一个默认的item delegate,有默认的paint函数的实现。但是如果想要自定义的实现,就需要提供自定义的item delegate实例并实现paint函数。在paint函数中可以用画笔qpainter或者qt提供的其它函数去实现渲染。
view委托给delegate对象的好处是,view的实现一旦写好