[Pyqt]⼀、MVC
MVC
mvc不仅仅是qt⾥⾯的概念,(Model View Controler)的简称
Model是⼀个数据模型、⼀个虚拟的东西,显⽰不出来的,如果我们要把这些数据显⽰出来,就需要使⽤view
view:⽤来显⽰Model这种数据
controler:如果我们要编辑数据,就需要使⽤controler
不使⽤controler,我们只能对数据进⾏查看不能编辑
就像我们去⽕车站买票,可以看到⽕车站有⼀个⼤屏幕,显⽰现在的票量,它后台的数据库就可以当作⼀个Model,⼀个数据模型,⼤显⽰器就像⼀个View,它可以显⽰后台的数据,现在有多少票,还剩下多少票,⽽且是实时动态刷新的,柜台⾥的电脑也可以是⼀个view,可以多个view显⽰同⼀个model,也就是说同⼀个数据模型,可以在不同的view上显⽰。那么在某⼀个view上⾯编辑了model数据,那么所有的view都会刷新这个数据
在pyqt中,view包括List View、Tree View、Table View、Column View
⾸先我们创建含有两个List View的UI布局:
List Widget:含有⼀些常⽤的功能,可以在属性编辑中处理元素
List View:没有属性设置,仅提供了view窗⼝,需要加上数据模型,通过分开控制,可以实现⾼度⾃定义
接下来就⽤List View来实现List Widget的功能
两个List View是没有任何区别的,两个List View使⽤同⼀个数据模型
Designer.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'mvc.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
self.widget = QtWidgets.alwidget)
self.widget.setGeometry(QtCore.QRect(32, 24, 525, 218))
self.widget.setObjectName("widget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.widget)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.listView1 = QtWidgets.QListView(self.widget)
self.listView1.setObjectName("listView1")
self.verticalLayout.addWidget(self.listView1)
self.horizontalLayout.addLayout(self.verticalLayout)
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label_2 = QtWidgets.QLabel(self.widget)
self.label_2.setObjectName("label_2")
self.verticalLayout_2.addWidget(self.label_2)
self.listView_2 = QtWidgets.QListView(self.widget)
self.listView_2.setObjectName("listView_2")
self.verticalLayout_2.addWidget(self.listView_2)
self.horizontalLayout.addLayout(self.verticalLayout_2)
MainWindow.alwidget)
ubar.setGeometry(QtCore.QRect(0, 0, 625, 26))
MainWindow.ubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
tSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = anslate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))        self.label.setText(_translate("MainWindow", "List View"))
self.label_2.setText(_translate("MainWindow", "List Widget"))
view.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from b.MVC.mvc import Ui_MainWindow
from b.MVC.mvc_core import ListMode
class DemonWindow(Ui_MainWindow, QtWidgets.QMainWindow):
"""
创建list model
"""
def __init__(self, parent=None):
super(Ui_MainWindow, self).__init__(parent)
self.setupUi(self)
self.list_model = ListMode(self.listView1)
self.listView1.setModel(self.list_model)
self.listView_2.setModel(self.list_model)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)  # sys.argv是⼀组命令⾏参数的列表,该程序会被cou进⾏轮询
ex = DemonWindow()
ex.show()
<_()
4,从Model中创建⼀个Model
self.list_model = ListMode(self.listView1)
仅创建⼀个Model,Model和View还没有产⽣关系,在我们实际编写过程中,我们的数据模型⼀定要写程实例的属性,这个实例我们要放在self下⾯,否则,在其他的⽅法⾥要操作这个模型的话,就访问不到了
5.将List View1的模型设置为上⾯实例化的self.list_model
self.listView1.setModel(self.list_model)
Model.py:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
class ListMode(QtCore.QAbstractListModel):
"""
创建list model
"""
def __init__(self, parent=None):
super(ListMode, self).__init__(parent)
self.list_data = list("ABCDE")
def rowCount(self, parent=QtCore.QModelIndex()):
"""
:param self:
:param parent:
:param args:
:param kwargs:
:return:
"""
return len(self.list_data)
def data(self, index = QtCore.QModelIndex(), role=QtCore.Qt.DisplayRole):
"""
:param QModelIndex:
:
param role:
:return:
"""
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return self.list_w()]
# 设置前景⾊
if role == QtCore.Qt.ForegroundRole:
return QtGui.QColor(255, 0, 0)
# 设置背景⾊
if role == QtCore.Qt.BackgroundColorRole:
return QtGui.QColor(0, 255, 0)
def flags(self, index=QtCore.QModelIndex()):
"""
:param index:
:return:
"""
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable
def setData(self, index = QtCore.QModelIndex(), value=None, role=QtCore.Qt.EditRole):        """
:param QModelIndex:
:param value:
:param role:
:return:
"""
if value != None:
self.list_w()] = value
it(index, index)
return True
1.QtCore.QAbstractListModel继承⾃QtCore.QAbstractItemModel,与之对应的还有QtCore.QAbstractTableModel针对List View 使⽤QtCore.QAbstractListModel就可以了,使⽤QtCore.QAbstractItemModel也可以,但是我们要写更多的⽅法
创建完⼀个QtCore.QAbstractListModel,本⾝是不知道谁要⽤它,所以没有⼀个基本的数据,直接⽤QtCore.QAbstractListModel是⽤不了的,所以我们要继承他,来写⼀个⾃⼰的模型
2.导⼊QT.Core
from PyQt5 import QtCore
我们的数据模型实际上⼀个不能显⽰的东西,是⼀个虚拟的东西,只能在后台有⼀层数据,但是显⽰不出来,在QT中,能显⽰的都是QWidgets,像图标之类的都是GUI,纯数据类型的就是Qt.Core⾥边的。
3.创建⼀个LIst Model继承⾃QtCore.QAbstractListModel
初始化函数,创建⼀个单纯的Model
# coding=utf-8
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
class ListMode(QtCore.QAbstractListModel):
"""
创建list model
"""
def __init__(self, parent=None):
super(ListMode, self).__init__(parent)
6.添加rowCount(self, parent=QtCore.QModelIndex()),并设置返回值5
def rowCount(self, parent=QtCore.QModelIndex()):
"""
:param self:
:param parent:
:param args:
:param kwargs:
:return:
"""
return 5
我们设置了⾏数,但是每⾏⾥要显⽰的数据还没有,接下来我们定义数据
7.添加data(self, index = QtCore.QModelIndex(), role=QtCore.Qt.DisplayRole),role为⼀种显⽰状态
def data(self, index = QtCore.QModelIndex(), role=QtCore.Qt.DisplayRole):
"""
:param QModelIndex:
:param role:
:return:
"""
if role == QtCore.Qt.DisplayRole or role == QtCore.Qt.EditRole:
return 0
8.添加flags(self, index=QtCore.QModelIndex()),状态激活,是否可以选择、是否可以拖拽

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。