How to edit string as items from QListWidget using with QDataWidgetMapper

111 Views Asked by At

I am using QListWidget, QSqlTableModel, QtableView and QDataWidgetMapper. QListWidget is ItemIsUserCheckable. I am able to save selected items from QListWidget into QtSql table in a single field as string format(converting list items into string as "Green, Green Grapes, Oranges". But at the same time i want to change the selected item and update the items from QListWidget of the String data. How to do. Is it possible. Or PLease let me know if any other solution. Below is the Example code:

from PyQt5 import QtCore, QtGui, QtWidgets, QtSql
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtSql import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(391, 496)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(9, 9, 373, 188))
        self.listWidget.setObjectName("listWidget")
        self.save_btn = QtWidgets.QPushButton(self.centralwidget)
        self.save_btn.setGeometry(QtCore.QRect(100, 230, 75, 23))
        self.save_btn.setObjectName("save_btn")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(9, 203, 27, 16))
        self.label.setObjectName("label")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(56, 203, 181, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.update_btn = QtWidgets.QPushButton(self.centralwidget)
        self.update_btn.setGeometry(QtCore.QRect(293, 229, 75, 23))
        self.update_btn.setObjectName("update_btn")
        self.edit_btn = QtWidgets.QPushButton(self.centralwidget)
        self.edit_btn.setGeometry(QtCore.QRect(199, 229, 75, 23))
        self.edit_btn.setObjectName("edit_btn")
        self.tableView = QtWidgets.QTableView(self.centralwidget)
        self.tableView.setGeometry(QtCore.QRect(9, 258, 373, 188))
        self.tableView.setObjectName("tableView")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 391, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName("fruites.db")
        if db.open():
            if db.open():
                query = QSqlQuery()
                query.exec_("""CREATE TABLE IF NOT EXISTS store(name TEXT, items TEXT)""")

        self.store_model = QtSql.QSqlTableModel()
        self.store_model.setTable("store")
        self.store_model.select()
        self.tableView.setModel(self.store_model)

        list_ = ["Green", "Green Apple","Green Grapes", "Bananas", "Oranges"]
        list_ = dict.fromkeys(list_, 0)
        for i in list_:
            item = QtWidgets.QListWidgetItem(i)
            item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.listWidget.addItem(item)

        self.save_btn.clicked.connect(self.save_item)
        self.edit_btn.clicked.connect(self.edit_item)
        self.update_btn.clicked.connect(self.submit_item)


    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.save_btn.setText(_translate("MainWindow", "Save"))
        self.label.setText(_translate("MainWindow", "Name"))
        self.update_btn.setText(_translate("MainWindow", "Update"))
        self.edit_btn.setText(_translate("MainWindow", "Edit"))

    def save_item(self):
        name = self.lineEdit.text()
        strng = ''
        checked = []
        for row in range(self.listWidget.count()):
            item = self.listWidget.item(row)
            if item.checkState():
                checked.append(item)
        strng = ", " .join(i.text() for i in checked)

        r = self.store_model.record()
        r.setValue("name", name)
        r.setValue("items", strng)
        self.store_model.insertRecord(-1, r)

        self.store_model.select()
        self.lineEdit.clear()
        for i in range(self.listWidget.count()):
            item = self.listWidget.item(i)
            item.setCheckState(QtCore.Qt.Unchecked)

    def edit_item(self):
        selected = self.tableView.selectedIndexes()
        if not self.store_model.rowCount():
            return
        index = self.tableView.currentIndex()
        if index.isValid():
            row = index.row()
        else:
            row = 0

        self.store_mapper = QtWidgets.QDataWidgetMapper()
        self.store_mapper.setSubmitPolicy(QtWidgets.QDataWidgetMapper.ManualSubmit)
        self.store_mapper.setModel(self.tableView.model())

        self.store_mapper.addMapping(self.lineEdit, 0)
        self.store_mapper.addMapping(self.listWidget, 1)

        self.store_mapper.setCurrentIndex(row)

    def submit_item(self):
        self.store_mapper.submit()
        self.lineEdit.clear()

        
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
0

There are 0 best solutions below