现在的位置: 首页 > 综合 > 正文

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

2012年11月14日 ⁄ 综合 ⁄ 共 1300字 ⁄ 字号 评论关闭
>通过上篇学习[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中呈现可编辑的数据

抱歉!评论已关闭.