Pyqt Model/view框架 2.自定义委托(Delegate)

>通过上篇学习[Pyqt Model/view框架 1.第一个model](http://www.cnblogs.com/hangxin1940/archive/2012/12/07/2806444.html),我们现在已经可以简单的通过model/view显示数据,在这篇中,我们会学到如何通过委托(delegate)控制view的显示 我的第一个Delegate --- 在[上篇](http://www.cnblogs.com/hangxin1940/archive/2012/12/07/2806444.html)已完成的代码中加入以下类: class MyDelegate(QStyledItemDelegate): """ 自定义的委托 用来在Model获取后,view显示前,再将数据渲染一次 """ def paint(self,painter,option,index): """ paint,有了画布画笔,想怎么显示就怎么显示,画什么按自己的想法来 """ #首先,从索引获取数据,这里获取当前索引角色为DisplayQole的数据 item_var=index.data(Qt.DisplayRole) #[QVariant] #数据是C格式,我们再转为Python格式,记住这点 item_str=item_var.toPyObject() #[QVariant] -> str #我们将数据以进度条的方式显现 opts=QStyleOptionProgressBarV2() opts.rect=option.rect #进度条所占的矩形大小 opts.minimum=0 opts.maximum=100 opts.text=str(item_str) #显示的内容 opts.textAlignment=Qt.AlignCenter opts.textVisible=True opts.progress=int(item_str) #设置当前进度 #这是关键 #让QApplication根据当前的风格渲染控件并画出来 QApplication.style().drawControl(QStyle.CE_ProgressBar,opts,painter) 并更改`main()`方法的内容: def main(): app=QApplication(sys.argv) #新建一个自定义Model model=MyListModel() #新建一个委托(Delagate) delegate=MyDelegate() #新建一个ListView view=QListView() #设置view的model view.setModel(model) #设置view的delegate view.setItemDelegate(delegate) view.show() sys.exit(app.exec_()) 运行后会发现,数据以进度条形式显示出来,这就是delegate的作用 >[下一篇](http://www.cnblogs.com/hangxin1940/archive/2012/12/07/2806450.html)中,我们将会掌握如何在view中呈现可编辑的数据
原文地址:https://www.cnblogs.com/hangxin1940/p/2806449.html