PyQt5: Model-View框架之QStringListModel、QListView

1.Model-View框架

PyQt5: Model-View框架之QStringListModel、QListView_第1张图片

(1)通讯(model、view、delegate之间使用“信号-槽”机制)

1)MODEL为体系中其它组件提供数据接口,与Data通讯
2)VIEW从Model中获取QModelindexs(,QModelindexs是指向DataItems的引用), 可通过获取datalitem的index,获取item
3)Delegate直接使用模型索引与模型通讯

(2)Data的数据结构

PyQt5: Model-View框架之QStringListModel、QListView_第2张图片

2. from PyQt5.QtCore import QStringListModel

Model类大概都继承于QtCore

3. from PyQt5.QtWidgets import QListView

View类应该都继承于QtWidgets
QListView是列表视图类,QListView应该是定义了View窗口及内嵌子窗口布局的对象及初始化属性值,而表达在QListView内的内容及所涉及的计算就交给了QStringListModel类对象,因他们两缺了谁都没意思,所以,使用前两者要先绑定在一起(一种对象层面的组合方式)

4. QStringListModel与QListView “绑定”

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数据结构图

5. 遍历QStringListModel中的items

示例代码:

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

声明:因为看书比较费时,所以,以上笔记仅为了记录自己的学习心得,仅表达自己通过网络搜索、边实践边思考的经验,表达的东东可能不够准确。

你可能感兴趣的:(PyQt5及其控件常用使用方法,qt,开发语言)