PyQt学习随笔:ListView控件的视图和数据模型分离案例

Qt 中view类控件的目的是实现数据和模型分离,控件展示数据,数据保存在数据存储中,数据存储中的数据改变了,则控件中展示的数据跟随改变。当设计时只指定了一个控件和一个数据存储关联时,这种分离虽然也能体现,但感觉没有那么明显,但如果使用两个View控件和同一个数据存储关联时,这种分离就能更好地理解。
下面是一个案例:
案例界面如图:
在这里插入图片描述
该案例在左边窗口下面的按钮操作增加和删除时,右边窗口同时改变。
实现的关键代码有如下:
1、初始化时两个窗口绑定同一个数据存储,如下:

    def __init__(self):
        super(appmain, self).__init__()
        self.setupUi(self)
        self.itemmodel=QStringListModel(self) #定义数据存储
        self.itemmodel.setStringList(["item1","item2"]) #数据存储初始化
        self.m_ListView.setModel(self.itemmodel) #第一个窗口绑定数据存储
        self.m_listViewCopy.setModel(self.itemmodel) #第二个窗口绑定同样的数据存储

2、增加一项的槽函数代码

    def AddListitem(self):
        count = self.itemmodel.rowCount()  #取数据存储的记录数
        selectindex = self.m_ListView.currentIndex() #取当前列表中选中的项的索引数据
        if selectindex.isValid():Pos = selectindex.row()+1 #取索引数据在存储中的序号位置
        else: Pos = count

        self.itemmodel.insertRow(Pos) #插入一项
        index = self.itemmodel.index(Pos,0) #取新插入项的索引数据
        stritem = f'item{Pos+1}' #需要显示的内容
        self.itemmodel.setData(index,stritem,Qt.DisplayRole) #数据存储新插入项的数据赋值
        self.m_ListView.setCurrentIndex(index)  

3、删除一项的槽函数代码

    def DelListItem(self):
         selected = self.m_ListView.selectedIndexes()  #取当前选中的项
         itemmodel = self.m_ListView.model() #取ListView控件的数据存储,这种方法是不知道数据存储实例变量时可以使用,实际上也可以直接用实例变量self.itemmodel
         for i in selected:
              itemmodel.removeRow(i.row())  #删除选中的项

使用PyCharm关联的项目完整代码老猿已上传资源到csdn,大家到老猿提供的ListView.rar资源文件中下载。

老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython

老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/98245036

请大家多多支持,点赞、评论和加关注!谢谢!**

原文地址:https://www.cnblogs.com/LaoYuanPython/p/11931727.html