MVC模式
MVC模式(Model-View-Controller,即模型-视图-控制器模式),是一种软件设计模式,将逻辑、用户界面、数据分离的模式。
PySide2中列表、表格等可以使用该模式。大体为:视图(View)、数据模型(Model)和委托(Delegate)。
Models:
- 基类为QAbstractItemModel。
- 两个标准模型为:QStandardItemModel、QFileSystemModel。
- 其他模型还有QStringListModel,QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel等。
Views:
- 基类为QAbstractItemView。
- 主要视图有列表(QListView)、表格(QTableView)、树结构(QTreeView)。
Delegates:
- 基类为QAbstractItemDelegate。
- 默认的delegate实现为QStyledItemDelegate。
- 其他还有QItemDelegate,区别是QStyledItemDelegate使用当前样式绘制item。
参考:Model/View Programming — Qt for Python
列表
简单的列表可以使用QListWidget实现。复杂一些的列表需要使用MVC模式。
这里举例为列表视图(QListView)、模型(QStandardItemModel)、以及从QStyledItemDelegate继承的Delegate。注:QStandardItemModel在PySide2.QtGui 模块中。
具体操作、各控件的属性和方法查看官方文档。PySide2和PySide6差不太多,都可以参考。PySide2.QtWidgets — Qt for Python,PySide6.QtWidgets - Qt for Python
创建列表视图和数据模型:
自定义mywindow类作为主窗口,继承于QMainWindow。
from PySide2.QtWidgets import QApplication, QMainWindow, QListView
from PySide2.QtGui import QStandardItemModel
class myWindow(QMainWindow):
def __init__(self):
super().__init__()
# 创建列表视图和数据模型
self.listview = QListView(self) # 列表视图
self.model = QStandardItemModel() # 数据模型
self.listview.setModel(self.model) # 设置视图和模型的关联
# 将列表视图设为主窗口的中央部件,并设置主窗口标题
self.setCentralWidget(self.listview)
self.setWindowTitle('QListView-QStandardItemModel Example')
if __name__ == '__main__':
app = QApplication()
window = myWindow()
window.show()
app.exec_()
设置列表视图:
class myWindow(QMainWindow):
def __init__(self):
...
# 设置列表视图
# listview.setSelectionMode(QListView.ExtendedSelection) # 允许多选
self.listview.setSelectionMode(QListView.SingleSelection) # 允许单选
self.listview.setAlternatingRowColors(True) # 交替行颜色
# self.listview.setEditTriggers(QListView.NoEditTriggers) # 禁止编辑
self.listview.setSpacing(10) # 设置行间距
self.listview.setAutoScroll(True) # 自动滚动条
往数据模型中添加数据:
from PySide2.QtGui import QStandardItem
class myWindow(QMainWindow):
def __init__(self):
...
listdata = ['Python', 'QT', 'PySide2', 'MVC', 'Item 5']
# 往数据模型中添加数据
for x in self.listdata:
item = QStandardItem(x)
item.setCheckable(True) # 设置为可选中,前有勾选框
self.model.appendRow(item)
列表视图添加上下文菜单:
在列表各项点击右键弹出菜单(上下文菜单)进行相应的便捷操作,例如:
- 若有选中项,则可右键点击进行插入数据、删除数据、上移/下移数据、追加数据、清空列表等操作 。
- 若是空列