实现 增-删-改 百度了半天都没有详细说的,半猜半试做出来,其中还有一些不太理解,先把我做出来的记录下来。
初步需要如下功能空间: listview pushbutton(删除按钮) lineedit(输入编辑栏) pushbutton(新增按钮)
基本界面如下:
一、实现界面布局及初始化
def initUI(self):
layout = QGridLayout()
self.listview = QListView() # 创建listview对象
# self.listview.setEditTriggers(QAbstractItemView.NoEditTriggers) # 屏蔽双击编辑listview
self.stringlistmodel = QStringListModel() # 创建stringlistmodel对象
self.stringlistmodel.setStringList(self.string_list) # 把数据赋值到 model 上
self.listview.setModel(self.stringlistmodel) # 把 view 和 model 关联
self.stringlistmodel.dataChanged.connect(self.save)
# 设置布局
self.delete_button = QPushButton()
self.delete_button.setText("删除")
self.delete_button.clicked.connect(self.delete_kw)
self.line_edit = QLineEdit()
self.add_button = QPushButton()
self.add_button.setText("增加")
self.add_button.clicked.connect(self.add_kw)
layout.addWidget(self.listview, 0, 0)
layout.addWidget(self.delete_button, 0, 1)
layout.addWidget(self.line_edit, 1, 0)
layout.addWidget(self.add_button, 1, 1)
self.setLayout(layout)
设置网格布局,分别添加四个空间,并把数据加到model上,model 和 view 关联。
二、添加项目
def add_kw(self):
"""
把 编辑栏 line_edit 中的 字符添加到 listmodel 中
:return:
"""
row = self.stringlistmodel.rowCount()
kw = self.line_edit.text()
self.stringlistmodel.insertRow(row)
self.stringlistmodel.setData(self.stringlistmodel.index(row), kw)
self.line_edit.setText("")
添加按钮 clicked 信号关联此槽函数;
- 先获取编辑栏的值,即要增加的字符 kw
- 获取model的行数,这个得到的是一个 整数
- 通过 insertRow 方法添加一行,其参数应该是行数,从0开始算
- 通过 setData 方法设置条目的值,第一个参数是第几行,第二个参数是值,测试时,如果第一个参数只是传入整形则会报错,需要通过 model.index(row) 传入,应该是要求 QModelIndex类型的对象
def delete_kw(self):
"""删除 listmodel 中选中的项"""
index = self.listview.currentIndex()
print(index.row())
self.stringlistmodel.removeRow(index.row())
5.把 lineedit 设回空值
三、删除项目
def delete_kw(self):
"""删除 listmodel 中选中的项"""
index = self.listview.currentIndex()
print(index.row())
self.stringlistmodel.removeRow(index.row())
-
view 的 currentIndex 方法 返回当前选中的项
-
model 的 removerow 方法删除对应列的项
四、编辑项目
双击listview即可实现编辑。
五、保存数据
上述操作只是修改model的数据,还需要把数据存到原始数据集中
def save(self):
self.string_list = self.stringlistmodel.stringList()
通过关联model的datachanged信号到该槽函数中,每一次的数据改动,都会把数据存入原始数据集中
六、全部代码
from PyQt5.QtWidgets import *
import sys
from PyQt5.QtCore import *
class Listview_Dialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.string_list = ["aa", "bb", "cc"] # 初始数据
self.initUI()
def initUI(self):
layout = QGridLayout()
self.listview = QListView() # 创建listview对象
# self.listview.setEditTriggers(QAbstractItemView.NoEditTriggers) # 屏蔽双击编辑listview
self.stringlistmodel = QStringListModel() # 创建stringlistmodel对象
self.stringlistmodel.setStringList(self.string_list) # 把数据赋值到 model 上
self.listview.setModel(self.stringlistmodel) # 把 view 和 model 关联
self.stringlistmodel.dataChanged.connect(self.save)
# 设置布局
self.delete_button = QPushButton()
self.delete_button.setText("删除")
self.delete_button.clicked.connect(self.delete_kw)
self.line_edit = QLineEdit()
self.add_button = QPushButton()
self.add_button.setText("增加")
self.add_button.clicked.connect(self.add_kw)
layout.addWidget(self.listview, 0, 0)
layout.addWidget(self.delete_button, 0, 1)
layout.addWidget(self.line_edit, 1, 0)
layout.addWidget(self.add_button, 1, 1)
self.setLayout(layout)
def add_kw(self):
"""
把 编辑栏 line_edit 中的 字符添加到 listmodel 中
:return:
"""
row = self.stringlistmodel.rowCount()
kw = self.line_edit.text()
self.stringlistmodel.insertRow(row)
self.stringlistmodel.setData(self.stringlistmodel.index(row), kw)
self.line_edit.setText("")
def delete_kw(self):
"""删除 listmodel 中选中的项"""
index = self.listview.currentIndex()
print(index.row())
self.stringlistmodel.removeRow(index.row())
def save(self):
self.string_list = self.stringlistmodel.stringList()
#print(self.string_list)
@staticmethod
def test():
import sys
app = QApplication(sys.argv)
window = Listview_Dialog() # 主窗
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
Listview_Dialog.test()
来源:CSDN
作者:jianglz-gz
链接:https://blog.csdn.net/weixin_40520077/article/details/104063588