1)MODEL为体系中其它组件提供数据接口,与Data通讯
2)VIEW从Model中获取QModelindexs(,QModelindexs是指向DataItems的引用), 可通过获取datalitem的index,获取item
3)Delegate直接使用模型索引与模型通讯
Model类大概都继承于QtCore
View类应该都继承于QtWidgets
QListView是列表视图类,QListView应该是定义了View窗口及内嵌子窗口布局的对象及初始化属性值,而表达在QListView内的内容及所涉及的计算就交给了QStringListModel类对象,因他们两缺了谁都没意思,所以,使用前两者要先绑定在一起(一种对象层面的组合方式)
QStringListModel对象、QListView对象通过下面代码“绑定”:(可参考:muzing的杂货铺https://muzing.top/posts/5ff61cbd/)!
代码功能: 想实现在QListView中鼠标拖放,以调整item的row顺序
开始还以为需要像MFC框架一样,后来发现QListView本身就可以通过设置QAbstractItemView类的“拖放”属性的来实现。
核心代码:
1)QListView所在的主窗口初始化过程中,完成与model的绑定,为了连接数据源,实现添加item
class winForm(Ui_MainWindow, QtWidgets.QMainWindow):
def __init__(self):
super(winForm, self).__init__() # 运行父类的构造方法
self.setupUi(self) # 传递自己
self.setWindowTitle('Data Deep Learning') #先setupUi然后修改属性,实现进一步UI与业务分离
self.dm=DataModel() #待处理的数据model
self.slm=QStringListModel()
self.listView.setModel(self.slm) #view绑定model
self.listView.setDragDropMode(QAbstractItemView.InternalMove)#设置控件内可drap、drop模式
其实这样就可以在控件内鼠标拖拽item了,但是拖拽时会出现几种情况:
I: 拖拽范围越出主窗口,会删去拖拽item,拖拽到可接受drop的控件上会接受item
II:控件内拖拽移动到其它item的位置,会覆盖掉(替换掉)该位置的原item
III:控件内拖拽移动到两item中间位置,会实现在这两item之间插入被移动的item
注: 有可能还会用到
(1)from PyQt5.QtWidgets import QAbstractItemView
*Abstract类 ,都是抽象类,抽象类定义了一些类属性(常量),不需要初始化对象就可以调用,下面示例中用到的Qt.DisplayRole属性也应该是这种情况
(2)from PyQt5.QtCore import Qt
(3)from PyQt5.QtCore import QModelIndex
QModelIndex对象保存着model的每个item的index,QModelIndex的结构对应着,前述的data数据结构图
示例代码:
def getListViewData(self):
model=self.listView.model()
row_count=model.rowCount()
rItem=[]
for i in range(row_count):
index =model.index(i,0) #获取items的i行,0列对应modelindex对象
str=model.data(index,Qt.DisplayRole)#Qt.DisplayRole实际上=0,类似C++里预定义的宏,对应一个整数
rItem+=[str]
return rItem