QT QListView

本文从WordPress迁移而来, 查看全部WordPress迁移文章

用了一下这个控件,然后发现不太顺手,用的过程中查了不少资料

发现这个东西,是MVC框架的一个实现例子,用了这个控件外,顺便找MVC的东西看看

Modal View Controler M是指数据模型,V是指用户界面,C则是控制器

  1. V使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示。
  2. C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

这两点在QListView中有体现,每个项目是以列表的形式显示的,但提供了方法可以改变项目的显示模式(就跟windows文件夹以不同视图显示)。另外在QListView中增删数据的时候,一开始考虑了要怎么实时刷新整个列表让其显示,但用起来发现,QT已经做好了实时刷新的功能

类型 含义
QStringList 存储字符串
QStringListModel 对应的model
QListView 显示数据

基本的三步:(python代码,c++仿照即可)

1
2
3
strlist = QStringList()
strmodel = QStringListModel(strList) # strmodel = QStringListModel() strmodel.setStringList(strlist)
strlistview = QListView(strmodel) # strlistview = QListView() strlistview.setModel(strmodel)

如果你希望listview的可以实现多选而不只是单选

1
strlistview.setSelectionMode(QAbstractItemView.ExtendedSelection) # ctrl + 单击 = 多选

灵活变通,可以去查一下还有没有其他的 QAbstractItemView.xxx 实现其他的选择功能

双击每个项目发现可以对其进行编辑,如果只是为了显示,查看,而不希望修改数据,则

1
strlistview.setEditTriggers(QAbstractItemView.NoEditTriggers)   #双击的时候不可编辑

如果增加新的项目

  • stringlistmodel 操纵的是一个 stringlist , 增加数据,可以先修改 stringlist,然后重新设置model去管理这个stringlist

例如,在最末尾添加一项

1
2
strlist.append('hello') #stringlist 末尾添加 字符串
strmodel.setStringList(strlist) #重新设stringlist
  • 直接对model操作(在row行进行插入)
1
2
3
4
5
6
strmodel.insertRow(row) #在row行插入,insertRows插入多行
madelindex = strModel.index(row) # model的索引不是单纯的int索引,通过row得到需要的model index
strmodel.setData(modelindex,'hello') # 设置数据,通过model index来找到位置
rowcount = strmodel.rowCount() #总数,实现在末尾插入
madelindex = strModel.index(rowcount)
strmodel.setData(modelindex,'hello')
  • 删除项目

同时操作stringlist和model

1
2
3
removeindex = strlist.indexOf('hello') #返回int索引
strlist.removeAt(removeindex) # 在stringlist中删除某一行的字符串
strmodel.removeRow(removeindex) #删除某一行,相关的函数是 removeRows(row,cnt) #从row行开始的cnt行

获取选中的项目

1
2
3
4
modelindexs = strlistview.selectedIndexes() #被选中的所有项,返回一个列表,currentIndex()返回的是当前选中的一行
for i in range(len(modelIndexs)):
data = modelIndexs[i].data().toString() #将数据转化为字符串
print data

取出所有数据,保存在一个stringList中

1
strlist = strmodel.stringList()

QlistView 的 selectAll() 和 reset() 槽函数,不解释,全选和重设

另外不得不说,QListView对应有QListWidget(是View的子类),操作起来更方便,两者的区别是,View可以设置多种Model,更丰富灵活,但也更难操作