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

>通过上篇学习Pyqt Model/view框架 1.第一个model,我们现在已经可以简单的通过model/view显示数据,在这篇中,我们会学到如何通过委托(delegate)控制view的显示

我的第一个Delegate

上篇已完成的代码中加入以下类:

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的作用 >下一篇中,我们将会掌握如何在view中呈现可编辑的数据

posted on   黑暗伯爵  阅读(3864)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2012年4月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12

统计

点击右上角即可分享
微信分享提示