[PYQT5] ListView QStringListModel 增-删-改

早过忘川 提交于 2020-01-23 02:28:21

实现 增-删-改 百度了半天都没有详细说的,半猜半试做出来,其中还有一些不太理解,先把我做出来的记录下来。

初步需要如下功能空间: 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 信号关联此槽函数;

  1. 先获取编辑栏的值,即要增加的字符  kw
  2. 获取model的行数,这个得到的是一个 整数
  3. 通过 insertRow 方法添加一行,其参数应该是行数,从0开始算
  4. 通过 setData 方法设置条目的值,第一个参数是第几行,第二个参数是值,测试时,如果第一个参数只是传入整形则会报错,需要通过 model.index(row) 传入,应该是要求 QModelIndex类型的对象

https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtcore/qmodelindex.html?highlight=qmodelindex#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())
  1. view 的 currentIndex 方法 返回当前选中的项

  2. 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()

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!